Tôi đã đến cuối hành vi này và nó không phải là lỗi của Mã hợp đồng.
tôi mở lắp ráp tạo ra trong ILSpy và đây là mã được sản xuất:
public Guid Id
{
get
{
Guid? guid = this.id;
if (!guid.HasValue)
{
throw new InvalidOperationException();
}
guid = this.id;
return guid.Value;
}
}
Các ví dụ biến id
đã được sao chép vào một biến cục bộ và biến cục bộ này đang được thiết lập lại trở về giá trị ban đầu của nó sau khối điều kiện. Bây giờ nó trở nên rõ ràng lý do tại sao Hợp đồng Mã đang hiển thị một lỗi vi phạm hợp đồng nhưng nó vẫn còn lại cho tôi nhầm lẫn lý do tại sao mã đã được viết lại trong hình thức này. Tôi đã thử nghiệm nhiều hơn một chút và lấy các Hợp đồng Mã ra khỏi dự án hoàn toàn và nó trở nên rõ ràng rằng đây là hành vi trình biên dịch C# tiêu chuẩn, nhưng tại sao?
Bí mật có vẻ là do một chi tiết nhỏ mà tôi vô tình bỏ qua khỏi câu hỏi ban đầu của mình. Biến thể hiện id
được khai báo là readonly
và điều này dường như có trách nhiệm khiến trình biên dịch thêm biến số guid
tạm thời.
Tôi phải thừa nhận tôi vẫn còn lúng túng do tại sao các trình biên dịch cảm thấy nó cần phải làm điều này để đảm bảo sự bảo đảm về tính bất biến cho id
nhưng tôi sẽ tiếp tục đào ...
Bạn đã thử 'id.HasValue'!? –
Định nghĩa của trường 'id' là gì? Có phải nó là sự hiểu biết 'readonly'? – Sven
Phát hiện trên Sven! - tốt đẹp bit của gỡ lỗi tâm linh :) (xem bên dưới) – Wheelie