鉴于这两个陈述......
((object)false) == ((object)false)
((object)false).Equals((object)false)
Run Code Online (Sandbox Code Playgroud)
第一个语句返回false.第二个语句返回true.
我理解为什么第一个语句返回false - 当布尔值被装箱时,它变成一个引用类型,并且两个引用不相等.但是,为什么/第二个陈述如何导致真实?
因为它仍然在调用多态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)
这将始终比较参考身份,没有永远运行任何特定类型的代码.