Çünkü dil belirtimi System.Exceptionorada bir tür ifadesi beklediği için (bu nedenle, nullbu 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ı nullyine de vakayla ilgilenmek zorunda kalacak . Görmek:
Exception ex = null;
if (conditionThatDependsOnSomeInput)
ex = new Exception();
throw ex;
Elbette, nullkelimenin 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 nullistisnanı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ü nullcesur 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 throwtalimat tarafından atıldığından bahseder . Bu talimatın açıklaması C # throwifadesiyle hemen hemen aynıdır (nesnenin türünü aşağıdakilerle sınırlamaması dışında System.Exception):
Açıklama:
throwKullanıcı durum nesnesi (tip atar Oyığı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.NullReferenceExceptioneğer atılır objolduğunu null.
Doğruluk:
Doğru CIL, nesnenin her zaman ya nullbir 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.