C# 比较可为null的

C# 比较可为null的,c#,nullable,C#,Nullable,基本上,Nullable是一种结构,它解释了调用之类的事情。HasValue永远不会抛出NullReferenceException。我想知道为什么——给定一个没有值的null值——与null的比较总是true,即使使用Object.ReferenceEquals,我认为会返回false,因为它是一个结构 CLR中是否有特殊的行为使之成为可能?它还可能解释为什么泛型结构约束不允许使用null 致以最诚挚的问候, 奥利弗·哈纳皮如果您这样做: int? x = null; if (x == nul

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

CLR中是否有特殊的行为使之成为可能?它还可能解释为什么泛型结构约束不允许使用null

致以最诚挚的问候,
奥利弗·哈纳皮

如果您这样做:

int? x = null;
if (x == null)
这将使用
HasValue


使用
Object.ReferenceEquals
将首先框选值,这将把空值转换为空引用(这确实是特殊的CLR行为)。当可为null的值类型被装箱时,结果是null引用或基础值类型的框。换句话说,不存在可空值类型的装箱值。

可空比较并不总是返回true。举个例子:

int? n = null;
int? m = 5;

Console.WriteLine(n == null);  // prints True
Console.WriteLine(m == null);  // prints False

CLR对
Nullable
s具有特殊的装箱行为,因此引用比较可以像您所期望的那样工作。本质上,结构的
属性被装箱到
对象中

是的,
可空
是一种特殊的结构,受编译器支持。我在博客上写过当它被编译成IL时会发生什么

我怀疑OP是在问为什么它会通过不同的测试方法返回null值为true,而不是在测试非null值时。@Jon Skeet:是的,我怀疑。但这个问题可能暗示了一种与此不同的行为,这就是我为什么选择提出这一点的原因。事实上,我对这个问题的理解与LBushkin的理解是一样的。+1对于我不清楚的问题,我担心的是,我实际上只是谈论了表示没有价值的null值。@Oliver Hanappi:不用担心。我不是想表现得粗鲁,我只是想指出问题的写法,它暗示了一些不真实的东西。由于SO被许多用户用作知识库,指出这些问题对社区很有帮助。谢谢,我一直在寻找特殊的拳击行为!