8

可能重复:
重写 Equals 方法时是否需要重写 == 和 != 运算符?(。网)

C#编译器提示我如果覆盖==,我应该覆盖equals,我只想知道为什么?

4

3 回答 3

12

如果您通过 重新定义相等性,如果与 做一些非常不同的事情==,它会变得非常混乱,并且必须作为后备,因为在编译时不知道类型时,只有可用。因此,定义实际上意味着:定义、和,并可能为某些实现。==.Equals.Equals.Equals====!=EqualsGetHashCodeIEquatable<T>T

于 2012-11-16T10:25:54.593 回答
4

因为否则您将有两个语义相似的操作,可能会产生不同的结果,这意味着很多混乱。

我不确定编译器是阻止你还是只是一个警告,但在任何一种情况下,确保它们的行为相同通常都是好的。

double.NaN == double.NaN与vs有类似的东西double.NaN.Equals(double.NaN)

于 2012-11-16T10:25:34.333 回答
1

因为否则,根据您进行比较的方式,您将获得不同的结果。

x == y可能会产生与做不同的结果y == x(如果xy是不同的类型)。其他比较,例如在列表中查找值或将其用作字典中的键不使用==运算符,因此根本不起作用。

于 2012-11-16T10:40:06.583 回答