两个相同的.NET对象并不是说它们

Jos*_*ose 14 c# equality equals

我有以下代码:

object val1 = 1;
object val2 = 1;

bool result1 = (val1 == val2);//Equals false
bool result2 = val1.Equals(val2); //Equals true
Run Code Online (Sandbox Code Playgroud)

那是怎么回事?修复此问题的唯一方法是使用.Equals()方法吗?

Mar*_*ers 33

运算符==是静态的,而不是虚拟的,因此行为由静态类型而不是运行时类型决定.引用类型的on对象的默认实现==是比较引用(例如,类型可以实现不同的行为string).您有两个不同的对象,它们没有相同的引用,因此==返回false.

正如您所指出的,解决方案是使用Equals.Equals是一种虚拟方法.由于value1具有运行时类型Int32,因此最终调用Int32.Equals.从.NET Reflector可以看到,其实现如下:

public override bool Equals(object obj)
{
    return ((obj is int) && (this == ((int) obj)));
}
Run Code Online (Sandbox Code Playgroud)

换句话说,它检查参数是否是类型int,如果是,则转换它并使用==为其定义的参数int.这比较了整数的.

修复此问题的唯一方法是使用.Equals()方法吗?

另一种方法是将对象转换为int然后使用==,就像执行Int32.Equalsdo一样.


And*_*rey 10

是.==检查参考相等性.使用Equals要比较的内容.

您可能想知道为什么对象如此.将整数(值类型)设置为对象变量时,会发生称为装箱的操作.此操作将值类型包装到对象中,并将其放在堆上并返回引用.这种情况发生两次,引用变得不同(尽管值相同).