将nullable与null进行比较

Oli*_*ppi 4 c# nullable

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

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


诚挚的问候,Oliver Hanappi

Jon*_*eet 19

如果你这样做:

int? x = null;
if (x == null)
Run Code Online (Sandbox Code Playgroud)

将使用HasValue.

使用Object.ReferenceEquals将首先输入值 - 并将空值转换为空引用(这确实是特殊的CLR行为).当装入可以为空的值类型时,结果是空引用或基础值类型的框.换句话说,没有可空值类型的盒装值.


LBu*_*kin 5

可空的比较并不总是返回true.举个例子,例如:

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

Console.WriteLine(n == null);  // prints True
Console.WriteLine(m == null);  // prints False
Run Code Online (Sandbox Code Playgroud)

CLR对Nullables 具有特殊的装箱行为,因此参考比较可以正常工作.本质上,Value结构的属性被装入一个object.