为什么default == implementation不能调用Equals?

Sib*_*Guy 23 .net c# java

可能重复:
为什么ReferenceEquals和==运算符的行为与Equals不同

==operator 的默认实现通过引用比较对象.因此,当您重写Equals(默认行为相同)时,您还必须指定==!=运算符,以便它们调用Equals(并在每个层次结构中生成它,==!=运算符不是虚拟的).

我的问题是为什么会这样?为什么==!=比较参照对象,而不是使用equals进行的?我想应该有这样一个基本的原因.

更新.

注释:我假设==应该依赖于Equals(但反之亦然),因为您可以在基类中重写Equals并自动在派生类中使用此实现.如果Equals ==在其实现中使用它将不起作用,因为==它不是虚拟的.

Ali*_*tad 9

我认为主要的原因是==是一个静态的运营商,可以在被称为null同时,对象Equals 需要一个实例.

例如:

Foo foo1 = null;
Foo foo2 = null;

Console.WriteLine(foo1 == foo2); // cannot use Equals
Run Code Online (Sandbox Code Playgroud)


Tig*_*ran 5

Object.ReferenceEquals是一个static比较引用相等性的成员.甚至值类型在传递给该方法之前都被装箱.

那么Equals,这是一种virtual方法,这意味着它允许消费者覆盖功能.

这么默认执行==行为假设默认的比较(参考)是确定你的,如果你需要一些具体的事情,在这种情况下框架提供了一个virtual方法,它可以被覆盖.