将nullable与null进行比较

时间:2010-08-24 21:38:19

标签: c# nullable

基本上,Nullable<T>是一个结构,它解释了调用.HasValue永远不会抛出NullReferenceException之类的内容。我想知道为什么 - 给定一个没有值的可空 - 与null的比较总是true,即使使用Object.ReferenceEquals,我认为它会返回false,因为它是一个结构

CLR内置了特殊行为以实现此目的吗?它也可能解释为什么泛型结构约束不允许无效。

最诚挚的问候,
Oliver Hanappi

3 个答案:

答案 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时会发生什么。