Nullable 是“预定义的值类型” – 或者Equals()和==如何在这里工作?

对于我自己实现的Equals()方法,我想检查一堆内部字段。 我是这样做的:

... _myNullableInt == obj._myNullableInt && _myString == obj._myString && ... 

我假设,这比较值,包括null,对于相等而不是对象地址(作为参考euqality比较操作会),因为:

对于此MSDN文档中的 “预定义值类型” ,可以这样说 。 我假设Nullable是这样的“预定义值类型”,因为它根据此MSDN文档位于System命名空间中。

我是否正确地假设VALUES在这里进行比较?

注意:unit testing显示“是”,但我希望其他人对这个问题感到放心,以防我错过了什么。

在C#中,有一个名为“Lifted Operators”的概念,在语言规范( 版本5下载 )的7.3.7节中描述:

提升的运算符允许在非可空值类型上运行的预定义和用户定义的运算符也可以与这些类型的可空forms一起使用。 提升运营商由满足特定要求的预定义和用户定义的运营商构建,如下所述

特别是:

对于等于运算符

 == != 

如果操作数类型都是非可空值类型并且结果类型是bool,则存在提升forms的运算符。 提升forms是通过添加一个? 每个操作数类型的修饰符。 提升的运算符认为两个空值相等,并且空值不等于任何非空值。 如果两个操作数都为非null,则提升的运算符将解包操作数并应用基础运算符以生成bool结果。

那么,既然在int之间定义了一个==运算符,那么还有一个为int?定义的运算符int? 小号

如果比较这些值,它实际上将调用Nullable.Equals方法,因为这两个值都是可为空的int。

Nullable.Equals最终将调用int的== compare关键字,如果两个值都不为null。 所以最后,它确实会检查这些值。

Equals方法的代码很好地说明了这一点:

 public override bool Equals(object other) { if (!this.HasValue) { return (other == null); } if (other == null) { return false; } return this.value.Equals(other); }