等于在另一个可空类型上与可空类型进行比较

arv*_*man 4 c#

我有两个对象(相同类型),其中包含一个myproptype 道具byte?。属性设置为null。当我执行时,objectA.myprop.Equals(objectB.myprop)尽管MSDN代码示例指出“等于应用于任何null对象都返回false”,但结果还是为“ true” 。

我猜想C#使用单独的重载进行可空类型比较。我想知道在这种情况下C#如何在内部处理对象与可为空的类型。

Jon*_*eet 5

当您这样称呼它时,它将使用Nullable<T>.Equals(object)它在文档中显示预期的行为:

(返回值是true...)

HasValue属性为false,另一个参数为null。即,根据定义,两个空值相等。

同样,对于通过的相等性==,C#4规范(提升的运算符)的7.3.7节指出:

对于相等运算符==[和] !=,如果操作数类型均为非空值类型且结果类型为bool,则存在运算符的提升形式。抬起的表格是通过添加单个?每个操作数类型的修饰符。提升运算符认为两个null值相等,并且null值不等于任何非null值。如果两个操作数都不为空,则提升操作符将取消包装操作数并应用基础操作符以产生布尔结果。

(强调我的。)

编辑:现在我实际上不同意这里接受的答案,它说这不是一般规则。以下方面而言,这一条一般规则object.Equals

对于Equals方法的所有实现,以下语句必须为true。在列表中,x,y和z表示不为null的对象引用。

[...]

  • x.Equals(null) 返回false。

因此,尽管这一条通用规则,但不适用于这种特定情况-因为此处的值不是对象引用 -它是值类型value。除非您基本上接受这Nullable<T>是一种特殊情况,否则它仍然有些令人惊讶-它具有特定的C#编译器支持,并且在装箱和拆箱方面具有CLR支持。