有人能解释一下为什么可以在
我可以在调试模式下检查
我自然会期望
创建一个实例不会改变任何内容:
null
实例上调用方法吗?int? num = null;
var s1 = num.ToString();
var s2 = num.HasValue;
var s3 = num.GetHashCode();
var s4 = num.GetValueOrDefault();
var s5 = num.Value; // InvalidOperationException
var s6 = num.GetType(); // NullReferenceException
我可以在调试模式下检查
num
是否为空,但是如果null
实例上调用ToString
方法或HasValue
getter,为什么可能呢?对于Value
和GetType
方法,则不可能。所有这些方法或属性都属于Nullable<>
类型,对吗?我自然会期望
Value
getter返回null
值,类似地,HasValue
返回false
。我还会期望GetType
返回Nullable<int>
类型信息,或者num is int?
或num is Nullable<int>
有效。为什么不起作用?如何检查num
是否为可空类型?创建一个实例不会改变任何内容:
Nullable<int> num = new Nullable<int>();
幕后的秘密是什么?
Nullable.ToString
的文档:“如果 HasValue 属性为 true,则当前 Nullable<T> 对象的值的文本表示,否则为一个空字符串 ("")。” - MakePeaceGreatAgainNullable<T>
是一个结构体,因此实际上不能为null
。这是编译器的特殊处理,使您能够首先执行int? num = null
。 - Zohar PeledToString
起作用而GetType
抛出NullReferenceException
的核心问题。 - Tim Schmelter