![](/img/trans.png)
[英]Nullable Property throwing NullReferenceException on .HasValue
[英]Why does Nullable<T> HasValue property not throw NullReferenceException on Nulls?
考慮以下代碼:
DateTime? ndate = null;
Console.WriteLine(ndate.HasValue);
我本來希望有NullReferenceException,但是HasValue確實會返回false。 但是,由於ndate為null,因為沒有對象可以調用HasValue屬性,所以屬性調用如何成功?
從技術上講,“ ndate”不為null-它是一種值類型,其值指定為null。
當您編寫DateTime?
,這只是Nullable<DateTime>
簡寫,它是一個結構。 從技術上講,這是不可能的,因為它不是引用類型。
Nullable<T>
是一個結構,基本上它不能保存null
值。
您的作業實際上被編譯成如下形式:
Nullable<DateTime> ndate = new Nullable<DateTime>();
另一個例子,表達式:
int? a = null;
將生成以下IL:
.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0)
IL_0000: ldloca.s V_0
IL_0002: initobj valuetype [mscorlib]System.Nullable`1<int32>
調用initobj
操作,該操作將指定地址處的value類型的每個字段初始化為空引用或適當的原始類型的0。
總之,這里發生的是默認的struct初始化 。
我本來希望NullReferenceException
有被dereferenced沒有空引用 ,所以“的NullReferenceException”不應該期望。 可空的DateTime不是空引用 。 它是一個空值 。
但是,由於ndate為null,因為沒有對象可以調用HasValue屬性,所以屬性調用如何成功?
這個問題的前提是錯誤的前提。 有一個物體。 有一個可為空的DateTime,表示可為null的DateTime的空值。 該值是一個對象。
考慮您的代碼:
DateTime? ndate = null;
Console.WriteLine(ndate.HasValue);
這只是編寫邏輯上類似的簡短方法:
DateTime ndate = default(DateTime);
bool ndateHasValue = false;
Console.WriteLine(ndateHasValue);
可空值類型只是編寫代碼的一種令人愉快的方式,它意味着“請在此事物上附加一個布爾值,以跟蹤它在邏輯上是否為空”。
真正發生的是,實際的(非null) Nullable結構被分配給了變量,因此變量不是null,而是Value。
朋友,我是Synctactic糖...編譯器將.HasValue調用轉換為不會引發異常的代碼:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.