==operator 的默认实现通过引用比较对象.因此,当您重写Equals(默认行为相同)时,您还必须指定==和!=运算符,以便它们调用Equals(并在每个层次结构中生成它,==而!=运算符不是虚拟的).
我的问题是为什么会这样?为什么==和!=比较参照对象,而不是使用equals进行的?我想应该有这样一个基本的原因.
更新.
注释:我假设==应该依赖于Equals(但反之亦然),因为您可以在基类中重写Equals并自动在派生类中使用此实现.如果Equals ==在其实现中使用它将不起作用,因为==它不是虚拟的.
我认为主要的原因是==是一个静态的运营商,可以在被称为null同时,对象Equals 需要一个实例.
例如:
Foo foo1 = null;
Foo foo2 = null;
Console.WriteLine(foo1 == foo2); // cannot use Equals
Run Code Online (Sandbox Code Playgroud)
Object.ReferenceEquals是一个static比较引用相等性的成员.甚至值类型在传递给该方法之前都被装箱.
那么Equals,这是一种virtual方法,这意味着它允许消费者覆盖功能.
这么默认执行==行为假设默认的比较(参考)是确定你的,如果你需要一些具体的事情,在这种情况下框架提供了一个virtual方法,它可以被覆盖.