为什么覆盖==必须覆盖等于?

时间:2012-11-16 10:24:00

标签: c# .net

  

可能重复:
  Is it necessary to override == and != operators when overriding the Equals method? (.NET)

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

3 个答案:

答案 0 :(得分:12)

如果您通过==重新定义平等,如果==.Equals做出非常不同的事情,.Equals.Equals非常不同,那么真的会让人感到困惑必须是后备,因为在编译时不知道类型时,只有==可用。因此,定义==确实意味着:定义!=EqualsGetHashCodeIEquatable<T>,并可能为T实施{{1}} 1}}。

答案 1 :(得分:4)

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

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

double.NaN == double.NaNdouble.NaN.Equals(double.NaN)之类似。

答案 2 :(得分:1)

因为否则您会得到不同的结果,具体取决于您进行比较的方式。

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