Đọc câu hỏi này trên HNQ, tôi tiếp tục đọc về các loại tham chiếu không thể đọc được trong C # 8 và thực hiện một số thử nghiệm.
Tôi rất ý thức rằng 9 lần trong số 10, hoặc thậm chí thường xuyên hơn, khi ai đó nói rằng "Tôi đã tìm thấy một lỗi trình biên dịch!" Đây thực sự là do thiết kế, và sự hiểu lầm của chính họ. Và kể từ khi tôi bắt đầu xem xét tính năng này chỉ ngày hôm nay, rõ ràng tôi không hiểu rõ lắm về nó. Với cách này, hãy xem mã này:
#nullable enable
class Program
{
static void Main()
{
var s = "";
var b = s == null; // If you comment this line out, the warning on the line below disappears
var i = s.Length; // warning CS8602: Dereference of a possibly null reference
}
}
Sau khi đọc tài liệu tôi liên kết ở trên, tôi mong muốn s == null
dòng này đưa ra cảnh báo cho tôi sau khi tất cả s
rõ ràng là không thể rỗng, vì vậy việc so sánh nó với null
nó không có ý nghĩa gì.
Thay vào đó, tôi nhận được một cảnh báo trên dòng tiếp theo và cảnh báo nói rằng đó s
có thể là một tài liệu tham khảo vô giá trị, mặc dù, đối với một con người, rõ ràng là không phải vậy.
Hơn nữa, cảnh báo không được hiển thị nếu chúng ta không so sánh s
với null
.
Tôi đã thực hiện một số Googling và tôi gặp phải sự cố GitHub , hóa ra là về một thứ hoàn toàn khác, nhưng trong quá trình tôi đã có một cuộc trò chuyện với một cộng tác viên để hiểu rõ hơn về hành vi này (ví dụ: "Kiểm tra Null thường là một cách hữu ích nói với trình biên dịch để thiết lập lại suy luận trước đó về tính vô hiệu của một biến. " ). Điều này vẫn còn cho tôi với câu hỏi chính chưa được trả lời, tuy nhiên.
Thay vì tạo ra một vấn đề GitHub mới và có khả năng chiếm thời gian của những người đóng góp dự án cực kỳ bận rộn, tôi sẽ đưa vấn đề này ra cộng đồng.
Bạn có thể vui lòng giải thích cho tôi những gì đang xảy ra và tại sao? Cụ thể, tại sao không có cảnh báo nào được tạo trên s == null
đường dây và tại sao chúng ta có CS8602
khi nó dường như không thể null
tham chiếu ở đây? Nếu suy luận vô hiệu không phải là bằng chứng đạn, như luồng GitHub được liên kết gợi ý, làm thế nào nó có thể sai? Điều gì sẽ là một số ví dụ về điều đó?
?
vì s
không thể null. Nó không trở nên vô giá trị, đơn giản vì chúng tôi đủ ngớ ngẩn để so sánh nó với null
.