【发布时间】:2019-02-05 18:55:47
【问题描述】:
有人可以解释为什么可以在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 怎么可能在null 实例上被调用,但对于Value 和@ 987654330@不可能吗?它们都是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 属性为真,则为当前 Nullable对象的值的文本表示,如果 HasValue 属性为假,则为空字符串 ("")。" -
Nullable<T>是一个结构体,因此实际上不可能是null。这是编译器的特殊处理,使您能够首先执行int? num = null。 -
大部分是 stackoverflow.com/questions/12725631/… 的副本。它已经解释了为什么
ToString有效而GetType抛出NullReferenceException的核心问题