Setelah membaca pertanyaan ini di HNQ, saya melanjutkan membaca tentang Jenis Referensi Nullable di C # 8 , dan membuat beberapa percobaan.
Saya sangat sadar bahwa 9 kali dari 10, atau bahkan lebih sering, ketika seseorang berkata "Saya menemukan bug penyusun!" ini sebenarnya oleh desain, dan kesalahpahaman mereka sendiri. Dan karena saya mulai melihat ke fitur ini hanya hari ini, jelas saya tidak memiliki pemahaman yang sangat baik tentang itu. Dengan ini, mari kita lihat kode ini:
#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
}
}
Setelah membaca dokumentasi yang saya tautkan di atas, saya berharap s == null
kalimat itu memberi saya peringatan — setelah semua s
jelas tidak dapat dibatalkan, jadi membandingkannya dengan null
tidak masuk akal.
Alih-alih, saya mendapatkan peringatan di baris berikutnya , dan peringatan itu mengatakan bahwa s
itu mungkin merupakan referensi nol, meskipun, bagi manusia, jelas itu bukan.
Terlebih lagi, peringatan tersebut tidak ditampilkan jika kita tidak membandingkan s
untuk null
.
Saya melakukan beberapa Googling dan saya mengenai masalah GitHub , yang ternyata sepenuhnya tentang hal lain, tetapi dalam prosesnya saya melakukan percakapan dengan seorang kontributor yang memberikan beberapa wawasan lebih dalam perilaku ini (mis. "Null cheque seringkali merupakan cara yang bermanfaat. memberitahu kompiler untuk mengatur ulang kesimpulan sebelumnya tentang nullability suatu variabel. " ). Ini masih meninggalkan saya dengan pertanyaan utama yang belum terjawab.
Alih-alih menciptakan masalah GitHub baru, dan berpotensi mengambil waktu dari kontributor proyek yang sangat sibuk, saya menempatkan ini untuk komunitas.
Bisakah Anda jelaskan apa yang terjadi dan mengapa? Khususnya, mengapa tidak ada peringatan yang dihasilkan di s == null
telepon, dan mengapa kita memiliki peringatan yang CS8602
sepertinya tidak null
mungkin ada di sini? Jika inferensi nullability tidak tahan peluru, seperti yang disarankan oleh thread GitHub yang tertaut, bagaimana bisa salah? Apa yang akan menjadi contohnya?
?
karena s
tidak dapat dibatalkan. Itu tidak menjadi nullable, hanya karena kami cukup bodoh untuk membandingkannya null
.