考慮下面的代碼:C# - 關閉初始化程序中的類字段?
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上它是臭名昭着的操作可能會破壞運行時。
它不爲我編譯....「非靜態字段,方法或屬性'ConsoleApplication2 .Square._operand'」需要對象引用。這是你的確切代碼嗎? –
是的,這是一個複製/粘貼,它爲我編譯。 –
請注意,我在VS2008上 - 正如Aaron指出的那樣,2010年編譯團隊可能已將此列爲錯誤(即與我同意:)) –