Tất cả các biến của cấu trúc phải được gán chắc chắn trước khi bạn có thể sử dụng bất kỳ phương pháp hoặc thuộc tính nào. Có hai bản vá có thể ở đây:
1) Bạn rõ ràng có thể gọi các nhà xây dựng parameterless:
public A(int x) : this()
{
B = x;
}
2) Bạn có thể sử dụng lĩnh vực này thay vì tài sản:
public A(int x)
{
b = x;
}
Tất nhiên tùy chọn thứ hai chỉ hoạt động trong biểu mẫu hiện tại của bạn - bạn có để sử dụng tùy chọn đầu tiên nếu bạn muốn thay đổi cấu trúc của mình để sử dụng thuộc tính tự động.
Tuy nhiên, quan trọng, bây giờ bạn có cấu trúc có thể thay đổi. Điều này hầu như luôn luôn là ý tưởng rất xấu . Tôi sẽ mạnh mong bạn sử dụng một cái gì đó giống như thay vì điều này:
struct A
{
private readonly int b;
public A(int x)
{
b = x;
}
public int B { get { return b; } }
}
EDIT: Thông tin chi tiết về việc tại sao mã gốc không hoạt động ...
Từ phần 11.3.8 của C# đặc tả :
If the struct instance constructor doesn't specify a constructor initializer, the this
variable corresponds to an out
parameter of the struct type
Bây giờ ban đầu đó sẽ không được chắc chắn được giao, có nghĩa là bạn không thể thực hiện bất kỳ hàm thành viên (bao gồm cả setters tài sản) cho đến khi tất cả những cái đầu tiên của cấu trúc con người xây dựng ed đã được ấn định rõ ràng. Trình biên dịch không biết hoặc cố gắng tính đến thực tế rằng trình thiết lập thuộc tính không cố gắng đọc từ một trường khác. Đó là tất cả để tránh đọc từ các lĩnh vực mà chưa được phân công rõ ràng.
Nguồn
2011-03-01 11:45:31
kiểm tra câu trả lời của tôi, bạn sẽ nhận được ý tưởng về nó rõ ràng –