考虑以下代码:
DateTime? ndate = null;
Console.WriteLine(ndate.HasValue);
我本来以为会抛出 NullReferenceException 异常,但实际上 HasValue 确实返回了 false。然而,既然 ndate 是 null,那么在没有对象的情况下如何成功调用该属性呢?从技术上讲,“ndate”不是null - 它是一个值类型,其值被指定为null。
当您编写DateTime?
时,这只是Nullable<DateTime>
的速记方式,它是一个结构体。由于它不是引用类型,因此从技术上讲无法为其设置null。
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
操作的过程,它将指定地址上的值类型的每个字段初始化为null引用或适当基元类型的0。DateTime? ndate = null;
Console.WriteLine(ndate.HasValue);
DateTime ndate = default(DateTime);
bool ndateHasValue = false;
Console.WriteLine(ndateHasValue);
可空值类型是一种简单的编码方式,意味着“请将一个布尔值附加到此对象上,以跟踪它是否逻辑上为null”。
Nullable<T>
有一个where T:struct
约束,对吧?我会认为这只是内部的一个标志。 - Dan Tao语法糖,我的朋友……编译器将那个.HasValue调用转换为不会抛出异常的代码 :-)
ndate = null
转换为 ndate = new Nullable<DateTime>()
。 - Greg