【发布时间】:2010-09-29 12:24:18
【问题描述】:
当我使用IEquatable<T> interface 实现我想比较的对象时:
- 如果我已经实现了
Equals(T),为什么还要重写Equals(object)方法? - 实现
IEquatable<T>后,我可以使用==和!=运算符吗?
【问题讨论】:
标签: c# iequatable
当我使用IEquatable<T> interface 实现我想比较的对象时:
Equals(T),为什么还要重写Equals(object) 方法?IEquatable<T> 后,我可以使用== 和!= 运算符吗?【问题讨论】:
标签: c# iequatable
来自MS Docs article on IEquatable<T>:
如果你实现
IEquatable<T>,你还应该重写 的基类实现Equals(Object)和GetHashCode()这样他们的行为是 与上述一致Equals(T)方法。如果你确实覆盖Equals(Object),你的 重写的实现也是 调用静态Equals(Object, Object)在你的课堂上使用方法。此外, 你应该重载op_Equality和op_Inequality运营商。 这确保了所有相等性测试 返回一致的结果。
不,operators do not use the Equals method。他们必须是 overloaded separately 才能这样做。
【讨论】:
1) 正如 Ray 所说,重写 Equals(object) 以确保从不知道(静态)您实现 IEquatable<T> 的类调用该方法时的一致性。例如,非泛型集合类将使用Equals(object) 进行比较。您还应该覆盖GetHashCode()。
2) 实现 IEquatable<T> 不会自动重载 == 和 != 运算符,但没有什么可以阻止您这样做,就像 System.String 一样。但是,如果您这样做,您应该非常清楚地记录这一点 - 并且在对仍将使用身份比较的其他类型的引用(例如 MyType 和 Object)进行比较时要小心。我怀疑这样做不是一个好主意,除非它在你的代码中是一个非常常用的类型,每个人都会非常熟悉它并且重载 == 的语法糖真的会对可读性产生积极影响。
【讨论】: