Рассмотрим следующий код:
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", ИЛИ
- вывести ошибку времени компиляции, если закрытие поля члена не допускается в этом сценарии
Вместо этого я получаю бессмысленное исключение, указанное в указанной строке. В версии 3.0 CLR это исключение NullReferenceException; на Silverlight CLR это печально известная Операция может дестабилизировать время выполнения.