Nullable <int>是“预定义值类型” - 或者Equals()和==如何在这里工作?</int>

时间:2014-06-16 07:39:21

标签: c# .net nullable string-comparison value-type

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

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

我认为,这会比较包括null的值,而不是对象地址(作为参考euqality比较操作),因为:

对于&#34;预定义的值类型&#34; in this MSDN doc here。 我假设Nullable<int>是一个&#34;预定义的值类型&#34;因为它位于根据this MSDN docSystem命名空间中。

我是否可以假设在这里比较VALUES?

注意:单元测试显示&#34;是&#34;但我希望其他人对这个问题感到放心,以防我错过了什么。

2 个答案:

答案 0 :(得分:24)

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

  

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

具体而言:

  

对于相等运算符

==  !=
  

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

因此,由于在==之间定义了int运算符,因此还为int?定义了一个运算符

答案 1 :(得分:8)

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

如果两个值都不为null,

Nullable<T>.Equals最终将调用int的== compare关键字。所以最后,它确实会检查这些值。

Equals方法的代码很好地展示了这一点:

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