在盒装布尔类型上使用==运算符和Equals方法有什么区别?

car*_*ter 6 c# boxing

鉴于这两个陈述......

((object)false) == ((object)false)
((object)false).Equals((object)false)
Run Code Online (Sandbox Code Playgroud)

第一个语句返回false.第二个语句返回true.

我理解为什么第一个语句返回false - 当布尔值被装箱时,它变成一个引用类型,并且两个引用不相等.但是,为什么/第二个陈述如何导致真实?

Jon*_*eet 8

因为它仍然在调用多态Equals方法.

使用不同类型演示的示例代码:

using System;

struct Foo
{
    public override bool Equals(object other)
    {
        Console.WriteLine("Foo.Equals called!");
        return true;
    }

    public override int GetHashCode()
    {
        return 1;
    }
}

class Program
{
    static void Main(string[] args)
    {
        object first = new Foo();
        object second = new Foo();
        first.Equals(second);
    }
}
Run Code Online (Sandbox Code Playgroud)

那仍然印有"Foo.Equals叫!" 因为在"框"上调用Equals方法仍然会调用Foo.Equals.

现在==没有被覆盖,它被重载 ...所以如果你写:

object first = ...;
object second = ...;
bool same = first == second;
Run Code Online (Sandbox Code Playgroud)

这将始终比较参考身份,没有永远运行任何特定类型的代码.