52

当我实现要使用IEquatable<T>接口比较的对象时:

  1. 如果我已经实现了,为什么我必须重写Equals(object)方法Equals(T)
  2. 实施后可以使用==and!=运算符IEquatable<T>吗?
4

2 回答 2

52
  1. 来自MS Docs 文章IEquatable<T>

    如果您实现IEquatable<T>,您还应该覆盖 和 的基类实现, Equals(Object)以便 GetHashCode()它们的行为与 Equals(T) 方法的行为一致。如果你做 override Equals(Object),你的覆盖实现也会在调用 Equals(Object, Object) 你的类的静态方法时被调用。此外,您应该重载op_Equality andop_Inequality运算符。这可确保所有相等性测试返回一致的结果。

  2. 不,运算符不使用 Equals 方法。它们必须单独重载才能这样做。

于 2009-01-04T19:11:36.543 回答
43

1)正如雷所说,Equals(object)当从不知道(静态)你实现的类调用方法时,覆盖以确保一致性IEquatable<T>。例如,非泛型集合类将Equals(object)用于比较。您还应该覆盖GetHashCode().

2) 实现IEquatable<T>不会自动重载 == 和 != 运算符,但没有什么可以阻止您这样做,就像这样做一样System.String。但是,如果您这样做,您应该非常清楚地记录这一点 - 并且在您对仍然使用身份比较的其他类型的引用(例如 MyType 和 Object)进行比较时要小心。我怀疑这样做不是一个好主意,除非它在你的代码中是一个非常常用的类型,每个人都会非常熟悉它,并且重载 == 的语法糖会对可读性产生积极影响。

于 2009-01-04T19:28:45.183 回答