HNQ hakkında bu soruyu okuduktan sonra , C # 8'de Null olabilecek Referans Türleri hakkında okumaya devam ettim ve bazı deneyler yaptım.
Birisi "Derleyici hata buldum!" Dediğinde 10 kişiden 9'unun, hatta daha sık olduğunu biliyorum. bu aslında tasarımdan ve kendi yanlış anlamalarından kaynaklanmaktadır. Ve bugün sadece bu özelliğe bakmaya başladığım için, açıkça çok iyi bir anlayışım yok. Bu şekilde, şu koda bakalım:
#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
}
}
Yukarıda bağlandığım belgeleri okuduktan sonra, s == null
hattın bana bir uyarı vermesini beklerdim - sonuçta s
açıkça geçersizdir, bu yüzdennull
geçersizdir mantıklı değildir.
Bunun yerine, bir sonraki satırda bir uyarı alıyorum ve uyarı şöyle diyor:s
bir insan için öyle olmadığı açık olsa da, boş bir referansın mümkün .
Daha fazla, uyarı edilir değil biz karşılaştırmak yoksa görüntülenen s
için null
.
Bazı Googling yaptım ve tamamen başka bir şeyle ilgili olduğu ortaya çıkan bir GitHub sorununa çarptım , ancak bu süreçte bu davranışla ilgili daha fazla fikir veren bir katılımcıyla bir görüşme yaptım (örn. "Boş denetimler genellikle yararlı bir yoldur derleyiciye bir değişkenin kuralsızlığı hakkındaki önceki çıkarımını sıfırlamasını söylemektir. " ). Ancak bu beni asıl soruya cevapsız bıraktı.
Yeni bir GitHub sorunu oluşturmak ve potansiyel olarak inanılmaz derecede proje katılımcılarına zaman ayırmak yerine, bunu topluma veriyorum.
Bana neler olduğunu ve nedenini açıklar mısınız? Özellikle, s == null
hatta neden hiçbir uyarı üretilmez ve burada CS8602
bir null
referans mümkün görünmediğinde neden var? Bağlantısız GitHub iş parçacığının da önerdiği gibi, nullabilite çıkarımı kurşun geçirmez değilse, nasıl yanlış gidebilir? Bunun bazı örnekleri nelerdir?
?
çünkü s
boş bırakılamaz . Null edilemez hale gelmez, çünkü onu karşılaştırmak için yeterince aptaldık null
.