【问题标题】:Why overriding == must override equals? [duplicate]为什么覆盖 == 必须覆盖等于? [复制]
【发布时间】:2012-11-05 01:33:04
【问题描述】:

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

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

【问题讨论】:

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

标签: c# .net


【解决方案1】:

如果您通过== 重新定义平等,那么如果== 所做的事情与.Equals 非常不同,那么它真的会令人困惑,并且.Equals 必须是后备,因为当该类型在编译时未知,只有.Equals 可用。因此,定义== 真正意味着:定义==!=EqualsGetHashCode,并可能为某些T 实现IEquatable<T>

【讨论】:

  • +1 是的,double.NaN 当你弄错时会刺痛 :-)
  • ==Equals 不可能在所有情况下都表现相同,我认为他们不应该被期望。更有帮助的是== 在可用的地方保持一致,而Equals 在任何地方都保持一致(因为它在任何地方都可用)。表示相同数字的数字类型应比较 == 的规则,即使它们在其他方面有所不同,而只有 100% 等效的事物应与 Equals 进行比较,恕我直言,这将比现在存在的 mishmosh 更有帮助。
  • 事实上,没有很好的方法来定义例如将Decimal 值映射到其字符串表示形式的字典,因为字典无法区分数字1.0m1.00m [其字符串表示形式应该不同]。 == 运算符应该将这些值视为相等,但这并不意味着 Equals 应该。此外,== 重载的定义方式通常无法实现等价关系,也没有真正测试数值相等性,因为例如16777217==16777216.0f.
【解决方案2】:

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

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

double.NaN == double.NaNdouble.NaN.Equals(double.NaN) 之间存在类似的情况。

【讨论】:

  • +1:有趣,我不知道double.NaN.Equals( double.NaN) == true
【解决方案3】:

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

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

【讨论】:

  • 为什么会有所不同?订单有什么用?
  • @MatíasFidemraizer:因为x == y 将在x 值上使用== 运算符,但y == x 将在y 值上使用== 运算符。如果它们的实现方式不同(例如y 使用默认对象比较),它们会给出不同的结果。
  • 啊,我明白了。但是如果xy 有不同的类型,就会发生这种情况。如果两者具有相同的类型,x == yy == x 的行为方式应该相同。也许您应该在我们的回答中指出这一点。
  • @MatíasFidemraizer:是的,我已经添加了。
  • 很好!!因为否则我对答案的内容有疑问。感谢您接受我的建议
猜你喜欢
  • 2015-05-11
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 2019-03-03
  • 2011-02-28
  • 2016-12-19
  • 1970-01-01
相关资源
最近更新 更多