基本上,Nullable<T>
是一个结构,它解释了调用.HasValue
永远不会抛出NullReferenceException
之类的内容。我想知道为什么 - 给定一个没有值的可空 - 与null
的比较总是true
,即使使用Object.ReferenceEquals
,我认为它会返回false,因为它是一个结构
CLR内置了特殊行为以实现此目的吗?它也可能解释为什么泛型结构约束不允许无效。
最诚挚的问候,
Oliver Hanappi
答案 0 :(得分:19)
如果你这样做:
int? x = null;
if (x == null)
将使用HasValue
。
使用Object.ReferenceEquals
将首先打包值 - 这会将空值转换为空引用(这确实是特殊的CLR行为)。当装入可以为空的值类型时,结果是空引用或底层值类型的框。换句话说,不存在可以为空的值类型的盒装值。
答案 1 :(得分:5)
Nullable比较并不总是返回true。举个例子,例如:
int? n = null;
int? m = 5;
Console.WriteLine(n == null); // prints True
Console.WriteLine(m == null); // prints False
CLR对Nullable
具有特殊的装箱行为,因此参考比较可以正常工作。实质上,结构的Value
属性被装箱为object
。
答案 2 :(得分:2)
是的,Nullable<T>
是一个享受编译器支持的特殊结构。我在博客上写了将其编译成IL here时会发生什么。