Xét đoạn mã sau:C# - đóng cửa trên các trường lớp bên trong trình khởi tạo?
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;
}
}
(! Bỏ qua việc thiết kế lớp; Tôi không thực sự viết một máy tính mã này chỉ đại diện cho một repro tối thiểu cho một vấn đề lớn hơn nhiều mà mất một thời gian để thu hẹp)
tôi mong chờ nó đến một trong hai:
- print "16", hOẶC
- ném một lỗi thời gian biên dịch nếu đóng cửa trên một trường thành viên không được phép trong trường hợp này
Thay vào đó, tôi nhận được một ngoại lệ vô nghĩa được ném vào dòng được chỉ định. Trên 3.0 CLR, nó là NullReferenceException; trên CLR Silverlight đó là hoạt động khét tiếng có thể làm mất ổn định thời gian chạy.
Nó không biên dịch cho tôi .... "Tham chiếu đối tượng là bắt buộc đối với trường, phương thức hoặc thuộc tính không tĩnh 'ConsoleApplication2 .Square._operand'". Đây có phải là mã chính xác của bạn không? –
Vâng, đó là bản sao/dán và nó biên dịch cho tôi. –
Lưu ý rằng tôi đang ở trên VS2008 - như Aaron lưu ý, nhóm biên dịch 2010 có thể đã phân loại này là lỗi (tức là đã đồng ý với tôi :)) –