Pertanyaan ini adalah subjek blog saya pada tanggal 30 Mei 2013 . Terima kasih atas pertanyaan bagusnya!
Anda sedang menatap jalan masuk yang kosong.
Seseorang bertanya kepada Anda, "bisakah jalan masuk Anda menampung Honda Civic?"
Iya. Ya bisa.
Seseorang mengarahkan Anda ke jalan masuk kedua. Itu juga kosong. Mereka bertanya, "Bisakah isi jalan masuk saya saat ini sesuai dengan jalan masuk Anda?"
Ya tentu saja. Kedua jalan masuk kosong! Jadi jelas satu konten bisa muat di yang lain, karena tidak ada konten di tempat pertama.
Seseorang bertanya kepada Anda, "Apakah jalan masuk Anda berisi Honda Civic?"
Tidak.
Anda berpikir bahwa isoperator menjawab pertanyaan kedua: dengan nilai ini, apakah itu cocok dengan variabel jenis itu? Apakah referensi nol cocok dengan variabel jenis ini? Ya, itu benar.
Itu bukanlah pertanyaan yang dijawab oleh isoperator. Pertanyaan yang isdijawab operator adalah pertanyaan ketiga. y is Xtidak meminta " adalah ynilai hukum dari variabel jenis X? " ia meminta " Apakah yreferensi yang valid untuk objek tipe X? " Sejak referensi nol bukan referensi yang valid untuk setiap objek setiap jenis, jawabannya adalah "tidak ada ". Jalan masuk itu kosong; itu tidak mengandung Honda Civic.
Cara lain untuk melihatnya adalah y is Xmenjawab pertanyaan "jika saya berkata y as X, apakah saya akan mendapatkan hasil bukan-nol? Jika y adalah nol, jelas jawabannya tidak!
Untuk melihat lebih dalam pada pertanyaan Anda:
Seseorang mengharapkan bahwa nilai null milik jenis referensi (atau nullable) apa pun
Seseorang akan secara implisit mengasumsikan bahwa suatu tipe adalah himpunan nilai , dan kompatibilitas penugasan dari nilai y dengan variabel tipe X tidak lebih dan tidak kurang dari memeriksa apakah y adalah anggota dari himpunan x .
Meskipun itu adalah cara yang sangat umum untuk melihat tipe, itu bukan satu - satunya cara untuk melihat tipe, dan itu bukan cara C # melihat tipe. Referensi kosong adalah anggota tanpa tipe di C #; kompatibilitas tugas ini tidak hanya memeriksa satu set untuk melihat apakah mengandung nilai. Hanya karena referensi null adalah tugas yang kompatibel dengan variabel referensi tipe X tidak berarti bahwa null adalah anggota tipe X. Relasi "adalah tugas yang kompatibel dengan" relasi dan "adalah anggota tipe" jelas memiliki banyak tumpang tindih, tetapi tidak identik di CLR.
Jika renungan tentang teori tipe menarik minat Anda, lihat artikel terbaru saya tentang masalah ini:
Apa yang Anda sebut "tipe"? Bagian satu
Apa yang Anda sebut "tipe"? Bagian kedua