Tôi đã theo dõi tính năng điều hành an toàn được thêm vào trong C# 6 với một số sở thích. Tôi đã mong chờ nó một lúc. Nhưng tôi đang tìm một số hành vi khác với tôi mong đợi. Tôi nhận ra tôi thực sự không hiểu nó hoạt động như thế nào.C# Toán tử điều hướng an toàn - điều gì đang thực sự xảy ra?
Với lớp này
class Foo {
public int? Measure;
}
Dưới đây là một số mã sử dụng các nhà điều hành mới.
Foo f = new Foo { Measure = 3 };
Console.WriteLine(f?.Measure); // 3
f = new Foo { Measure = null };
Console.WriteLine(f?.Measure); // null
f = null;
Console.WriteLine(f?.Measure); // null
Đến đây, mọi thứ hoạt động như mong đợi. ?.
đang truy cập vào các thành viên khi phía bên tay trái không phải là rỗng, nếu không trả về null. Nhưng ở đây mọi thứ diễn ra theo hướng tôi không mong đợi.
var i = f?.Measure; // i is Nullable<int>
Console.WriteLine(i.HasValue); // false
Console.WriteLine(f?.Measure.HasValue); // null
Cái gì?
Tại sao tôi có thể nhận được HasValue
từ i
, nhưng không phải từ cùng một biểu thức mà tôi đã gán cho i
? Làm thế nào có thể HasValue
bao giờ được null?
Chỉnh sửa: Câu hỏi thực sự của tôi là về hành vi của chương trình chứ không phải lỗi biên dịch. Tôi đã loại bỏ các nội dung bổ sung về biên dịch và tập trung câu hỏi này hẹp hơn về lý do tại sao hai kết quả khác nhau được trả về bởi những gì có vẻ giống như logic.
có thể trùng lặp của [toán tử điều kiện null không hoạt động với các loại có thể vô hiệu hóa?] (Http://stackoverflow.com/questions/31811392/null-conditional-operator-not-working-with-nullable-types) – shf301
Điều đó câu hỏi là về lỗi biên dịch. Vì câu hỏi thực sự của tôi không phải là về lỗi biên dịch, mà là hành vi của chương trình, tôi đã làm sáng tỏ câu hỏi của mình về hiệu ứng đó. – recursive