为什么NullableHasValue属性不会在Null上抛出NullReferenceException?考虑以下代码:日期时间?日期=空;Console.WriteLine(ndate.HasValue);我期待NullReferenceException,但HasValue确实返回false。但是既然ndate为null,既然没有调用属性HasValue的对象,那么属性调用怎么会成功呢?从技术上讲,“ndate”不是null-它是一个值类型,其值被指定为null。什么时候写DateTime?,那只是Nullable的简写,它是一个结构。这在技术上是不可空的,因为它不是引用类型。Nullable是一个结构,基本上它不能保存空值。你的任务实际上编译成这样的东西:Nullablendate=newNullable();另一个例子,表达式:int?一个=空;将生成以下IL:.localsinit(valuetype[mscorlib]System.Nullable`1V_0)IL_0000:ldloca.sV_0IL_0002:initobjvaluetype[mscorlib]System.Nullable`1调用初始化每个字段的initobj操作指定地址处的值类型为空引用或适当的原始类型0。无论如何,这里发生的是默认结构初始化。我本以为NullReferenceException没有取消引用空引用,因此不应期望出现“NullReferenceException”。可为空的DateTime不是空引用。它是一个空值。但是既然ndate为null,既然没有调用属性HasValue的对象,那么属性调用怎么会成功呢?这个问题预示着一个错误的前提。有一个对象。具有NullableDateTime表示NullableDateTime的空值。该值是一个对象。考虑您的代码:日期时间?日期=空;Console.WriteLine(ndate.HasValue);这只是编写逻辑上类似于以下内容的简短方法:DateTimendate=default(DateTime);boolndateHasValue=false;Console.WriteLine(ndateHasValue);可空值类型只是一种编写代码的愉快方式,这意味着“请将布尔值附加到此事件以跟踪它是否在逻辑上为空”。真正发生的是实际的(非空的)可空结构被分配给变量,所以变量不是空的,但它的值是。句法糖我的朋友...编译器将.HasValue调用转换为不会引发异常的代码:-)C#教程就是这样:为什么NullableHasValue属性不在Null上引发NullReferenceException?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
