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

Mar*_*cel 27 .net c# nullable value-type string-comparison

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

...
_myNullableInt == obj._myNullableInt &&
_myString == obj._myString &&
...
Run Code Online (Sandbox Code Playgroud)

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

对于此MSDN文档中的 "预定义值类型" ,可以这样说.我假设Nullable<int>是这样一个"预定义的值类型",因为System根据这个MSDN文档,它在命名空间中.

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

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

Dam*_*ver 24

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

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

具体而言:

对于等于运算符

==  !=
Run Code Online (Sandbox Code Playgroud)

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

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


Pat*_*man 8

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

Nullable<T>.Equals==如果两个值都不为null,最终将调用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);
}
Run Code Online (Sandbox Code Playgroud)