2012-11-16 34 views
8

可能重复:
Is it necessary to override == and != operators when overriding the Equals method? (.NET)为什么重写==必须重写equals?

C#编译器会提示我,我应该重写等于如果重写==,我只是想知道为什么吗?

+3

可能的重复:http://stackoverflow.com/q/1222035/238902 – Default

+1

@Default其实,我不认为它是重复的 - 但它们是链接的。这一个是“当提供==时,我应该覆盖Equals?” (答案通常是:是),其中“另一个是”当重写Equals时,我必须提供==吗? (答案一般是:不,不是) –

回答

4

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

我不确定编译器是否会阻止您,或者它只是一个警告,但无论如何,通常都会确保它们的行为相同。

有这样的事情,double.NaN == double.NaNdouble.NaN.Equals(double.NaN)

+0

+1:有趣的是,我并不知道double.NaN.Equals(double.NaN)== true'。 – Henrik

12

通过==如果要重新定义平等,它得到真的混乱,如果==做某事.Equals很大的不同,.Equals必须回退,因为当类型没有在编译时已知,只有.Equals是可用。因此,定义==确实意味着:定义==,!=,EqualsGetHashCode,并且可能对某些T实施IEquatable<T>

+0

+1是的,'double.NaN'在你遇到错误时刺痛:-) –

+0

==和Equals在所有情况下都不可能相同,我认为它们不应该被期望。更有帮助的是'=='在它可用的地方是一致的,'Equals'在任何地方都是一致的(因为它在任何地方都是可用的)。一个规则是,表示相同数字的数字类型应该比较'==',即使它们在其他方面有所不同,而只有100%等价的东西才应该比较为'Equals',那么恕我直言比现在存在的mishmosh更有帮助。 – supercat

+0

事实上,没有很好的方法来定义例如一个将Decimal值映射到字符串表示的字典,因为字典无法区分数字“1.0m”和“1.00m”(其字符串表示应该不同)。 == ==运算符应该将这些值视为相等,但这并不意味着“Equals”应该。此外,定义'=='重载的方式,它往往不能实现等价关系,并且不能真正测试数值相等,因为例如, '16777217 == 16777216.0f'。 – supercat

1

因为否则你会得到不同的结果取决于你如何做比较。

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

+0

为什么会有所不同?有什么命令? –

+0

@MatíasFidemraizer:因为'x == y'会在'x'值上使用'=='运算符,但'y == x'会在'y'值上使用'=='运算符。如果它们以不同方式实现(例如'y'使用默认的对象比较),他们给出了不同的结果。 – Guffa

+0

啊,我明白了。但是如果'x'和'y'有不同的类型就会发生这种情况。如果两者都具有相同的类型,则'x == y'或'y == x'应该以相同的方式表现。也许你应该在我们的答案中指出这一点。 –

相关问题