C# 是可为空的<;int>;a「;预定义值类型";-或者Equals()和==在这里是如何工作的?

C# 是可为空的<;int>;a「;预定义值类型";-或者Equals()和==在这里是如何工作的?,c#,.net,nullable,string-comparison,value-type,C#,.net,Nullable,String Comparison,Value Type,对于我自己的Equals()方法实现,我想检查一组内部字段。我是这样做的: ... _myNullableInt == obj._myNullableInt && _myString == obj._myString && ... 我假设这会比较相等的值,包括null,而不是对象地址(作为引用euqality比较操作),因为: 对于“预定义值类型”,可以这样说。 我假设Nullable是这样一种“预定义值类型”,因为它位于系统名称空间中 我假设在这里比较这些值是

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

...
_myNullableInt == obj._myNullableInt &&
_myString == obj._myString &&
...
我假设这会比较相等的值,包括null,而不是对象地址(作为引用euqality比较操作),因为:

对于“预定义值类型”,可以这样说。 我假设
Nullable
是这样一种“预定义值类型”,因为它位于
系统
名称空间中

我假设在这里比较这些值是否正确?


注意:单元测试显示“是”,但我想让其他人对这个问题放心,以防我遗漏了什么。

如果比较这些值,它实际上会调用该方法,因为这两个值都是可为空的整数

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

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

public override bool Equals(object other)
{
    if (!this.HasValue)
    {
        return (other == null);
    }
    if (other == null)
    {
        return false;
    }
    return this.value.Equals(other);
}
在C#中,有一个称为“提升运算符”的概念,在语言规范()的第7.3.7节中描述:

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

具体来说:

对于等式运算符

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


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

定义的运算符,实际上是另一种方式,
可空。Equals
最终调用
=
实际值类型…这反过来调用
=
预定义值类型。。请参阅,
对于预定义的值类型,如果其操作数的值相等,则相等运算符(=)返回true(对于预定义的值类型,则不返回):)查看IL:)
int.Equals((obj为int)和&(this=((int)obj))@flindeberg:相应地更新了我的答案。Thans,我实际上在你提到的规范章节中查找了它。这给了我希望得到的安慰。
==  !=