有人可以解释为什么它可以调用上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
吸气可以null
实例调用,但Value
和GetType
是不可能的?所有这些都是方法或Nullable<>
类型属性或不?
我自然会想到Value
吸气回报null
值,同样作为HasValue
返回false
。我期望太高,这GetType
返回Nullable<int>
键入信息,或num is int?
或num is Nullable<int>
作品。为什么不工作?我怎么可以检查num
是可空类型?
创建一个实例在不改变任何东西:
Nullable<int> num = new Nullable<int>();
什么是幕后?
Nullable<T>
有一点的编译器法宝,使得它看起来好像有一个null
值。但是没有。基本上,由于Nullable<T>
是一个值类型,它不能是null
开始。它确定为空性是否有值与否。这意味着,你可以调用HasValue
(这是很重要的,因为这就是当你写的编译器插入num == null
)和不依赖于价值存在其他方法。
至于一些具体问题:
ToString
是工作原理类似于如何null
值字符串串联使用时,即产生一个空字符串被转换成字符串的实现。你也真的不希望ToString
永远扔。GetHashCode
必要把Nullable<T>
作为重点在字典中,或者将它们放入一个HashSet。它也应该不会丢,所以它返回的东西懂事时,有没有价值。访问值时,没有一个是被禁止的,虽然。正如评论Zohar Peled和Marc Gravell ♦注意,这是在调用GetType
什么时候发生的隐式:
这似乎是合乎逻辑的编译器可能只是默默的
nullableValue.GetType()
取代typeof(SomeT?)
,但随后这将意味着相比时它总是给混乱的答案object obj = nullableValue; Type type = obj.GetType()
你可能会认为这类似的工作,但
obj.GetType()
总是返回要么typeof(T)
(不typeof(T?)
),或抛出一个NullReferenceException
因为T?
盒到任何一个T
或null
(和你不能要求一个null
它是什么类型)
结构的编译器特别处理的映射是多少如下:
num == null → !num.HasValue
num != null → num.HasValue
num = null → num = new Nullable<int>()
num = 5 → num = new Nullable<int>(5)
(int) num → num.Value
(object) num → (object) num.Value // if HasValue
→ (object) null // if !HasValue
有运营商,最重要的比较运算符非空的T
s和像null
潜在??
值工作各个运营商额外的支持,但是这是它的要点。
不是一个真正的答案,而只是一个音符。你写:
我自然会想到
Value
吸气回报null
值
没有!该Nullable<T>
存在的真正原因是为了保护你获得null
值没有检查。