Çünkü dil belirtimi System.Exception
orada bir tür ifadesi beklediği için (bu nedenle, null
bu bağlamda geçerlidir) ve bu ifadeyi boş olmayacak şekilde kısıtlamaz. Genel olarak, bu ifadenin değerinin olup olmadığını tespit etmenin bir yolu yoktur null
. Durma problemini çözmesi gerekecekti. Çalışma zamanı null
yine de vakayla ilgilenmek zorunda kalacak . Görmek:
Exception ex = null;
if (conditionThatDependsOnSomeInput)
ex = new Exception();
throw ex;
Elbette, null
kelimenin tam anlamıyla geçersiz hale getirme durumlarını geçersiz kılabilirler, ancak bu pek yardımcı olmaz, öyleyse neden spesifikasyon alanını boşa harcayıp tutarlılığı az bir fayda için azaltsın?
Feragatname (Eric Lippert tarafından tokatlanmadan önce): Bu, bu tasarım kararının arkasındaki mantıkla ilgili kendi spekülasyonum. Tabii ki tasarım toplantısına katılmadım;)
İkinci sorunuzun yanıtı, bir catch cümlesinde yakalanan bir ifade değişkeninin boş olup olamayacağı: C # belirtimi, diğer dillerin bir null
istisnanın yayılmasına neden olup olamayacağı konusunda sessiz olsa da, istisnaların yayılma şeklini tanımlar:
Varsa, yakalama cümleleri, istisna için uygun bir işleyiciyi bulmak için görünüm sırasına göre incelenir. İstisna türünü veya istisna türünün temel türünü belirten ilk catch yan tümcesi eşleşme olarak kabul edilir. Genel bir yakalama cümlesi, herhangi bir istisna türü için eşleşme olarak kabul edilir. [...]
Çünkü null
cesur ifade yanlıştır. Bu nedenle, tamamen C # spesifikasyonunun söylediğine bağlı olsa da, temeldeki çalışma zamanının hiçbir zaman boş değer atmayacağını söyleyemeyiz, bu durumda bile, yalnızca genel catch {}
cümle tarafından ele alınacağından emin olabiliriz .
CLI üzerindeki C # uygulamaları için ECMA 335 spesifikasyonuna başvurabiliriz. Bu belge, CLI'nin dahili olarak oluşturduğu (hiçbiri olmayan null
) tüm istisnaları tanımlar ve kullanıcı tanımlı istisna nesnelerinin throw
talimat tarafından atıldığından bahseder . Bu talimatın açıklaması C # throw
ifadesiyle hemen hemen aynıdır (nesnenin türünü aşağıdakilerle sınırlamaması dışında System.Exception
):
Açıklama:
throw
Kullanıcı durum nesnesi (tip atar O
yığında) ve yığın boşaltır. İstisna mekanizmasının ayrıntıları için, Bölüm I'e bakın.
[Not: CLI herhangi bir nesnenin atılmasına izin verirken, CLS, dilin birlikte çalışabilirliği için kullanılacak belirli bir istisna sınıfını tanımlar. son not]
İstisnalar:
System.NullReferenceException
eğer atılır obj
olduğunu null
.
Doğruluk:
Doğru CIL, nesnenin her zaman ya null
bir nesne referansı (yani tür O
) olmasını sağlar.
Bunların yakalanan istisnaların asla olmadığı sonucuna varmak için yeterli olduğuna inanıyorum null
.