Câu hỏi này là chủ đề của blog của tôi vào ngày 30 tháng 5 năm 2013 . Cảm ơn vì câu hỏi tuyệt vời của bạn!
Bạn đang nhìn chằm chằm vào một đường lái xe trống.
Có người hỏi bạn "đường lái xe của bạn có thể giữ một chiếc Honda Civic không?"
Đúng. Có nó có thể.
Ai đó chỉ bạn ở một đường lái xe thứ hai. Nó cũng trống rỗng. Họ hỏi "Nội dung hiện tại của đường lái xe của tôi có vừa với đường lái xe của bạn không?"
Vâng, rõ ràng. Cả hai đường lái xe đều trống! Vì vậy, rõ ràng nội dung của một trong những có thể phù hợp với nhau, bởi vì không có nội dung của một trong hai ở nơi đầu tiên.
Có người hỏi bạn "Đường lái xe của bạn có chứa một chiếc Honda Civic không?"
Không nó không.
Bạn đang nghĩ rằng is
toán tử trả lời câu hỏi thứ hai: được đưa ra giá trị này, nó có phù hợp với một biến của loại đó không? Có một tham chiếu null phù hợp với một biến của loại này? Có nó làm.
Đó không phải là câu hỏi mà người is
vận hành trả lời. Câu hỏi mà người is
vận hành trả lời là câu hỏi thứ ba. y is X
không yêu cầu " là y
một giá trị pháp lý của một biến kiểu X
? " nó hỏi " có phải là y
một tài liệu tham khảo có giá trị cho một đối tượng của loại hình X
? " Kể từ khi một tham chiếu null không phải là một tài liệu tham khảo có giá trị cho bất kỳ đối tượng của bất kỳ loại, câu trả lời là "không ". Đường lái xe đó trống rỗng; Nó không chứa một chiếc Honda Civic.
Một cách khác để xem xét đó là y is X
trả lời câu hỏi "nếu tôi nói y as X
, tôi có nhận được kết quả không null không? Nếu y là null, rõ ràng câu trả lời là không!
Để nhìn sâu hơn một chút vào câu hỏi của bạn:
Người ta kỳ vọng rằng giá trị null thuộc về bất kỳ loại tham chiếu (hoặc nullable) nào
Người ta sẽ mặc nhiên cho rằng một loại là một tập hợp các giá trị và khả năng tương thích gán của một giá trị y với một biến loại X không có gì khác hơn là kiểm tra xem y có phải là thành viên của tập x không .
Mặc dù đó là một cách cực kỳ phổ biến để xem xét các loại, nhưng đó không phải là cách duy nhất để xem các loại và đó không phải là cách mà C # nhìn vào các loại. Tài liệu tham khảo Null là thành viên không có loại trong C #; khả năng tương thích nhượng được không chỉ đơn thuần là kiểm tra một tập để xem nếu nó chứa một giá trị. Chỉ vì tham chiếu null tương thích gán với biến của loại tham chiếu X không có nghĩa là null là thành viên của loại X. Quan hệ "được gán tương thích với" và quan hệ "là thành viên của loại" rõ ràng có rất nhiều chồng chéo, nhưng chúng không giống nhau trong CLR.
Nếu suy nghĩ về lý thuyết loại bạn quan tâm, hãy xem các bài viết gần đây của tôi về chủ đề này:
Cái mà bạn gọi là "loại" là gì? Phần một
Cái mà bạn gọi là "loại" là gì? Phần hai