Рассмотрим следующий код:
using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var square = new Square(4);
Console.WriteLine(square.Calculate());
}
}
class MathOp
{
protected MathOp(Func<int> calc) { _calc = calc; }
public int Calculate() { return _calc(); }
private Func<int> _calc;
}
class Square : MathOp
{
public Square(int operand)
: base(() => _operand * _operand) // runtime exception
{
_operand = operand;
}
private int _operand;
}
}
(не обращайте внимания на дизайн класса; на самом деле я не пишу калькулятор! этот код просто представляет собой минимальное воспроизведение гораздо более серьезной проблемы, решение которой заняло некоторое время)
Я бы ожидал, что это либо:
- напечатать "16", ИЛИ
- выдать ошибку времени компиляции, если закрытие поля члена не разрешено в этом сценарии
Вместо этого я получаю бессмысленное исключение в указанной строке. В среде CLR 3.0 это NullReferenceException; в Silverlight CLR это печально известная Операция может дестабилизировать среду выполнения.