当我实现要使用IEquatable interface进行比较的对象时
如果我已经实现了Equals(T)
IEquatable<T>
之后,我使用==和!=运算符,为什么必须重写Equals(object)方法
发布于 2009-01-04 19:11:37
来自MS Docs article on IEquatable的
如果实现IEquatable<T>,还应该覆盖Equals(Object)和GetHashCode()的基类实现,以便它们的行为与Equals(T)方法的行为一致。如果确实重写了Equals(Object),则还会在调用类上的静态Equals(Object, Object)方法时调用重写的实现。此外,您应该重载op_Equality和op_Inequality运算符。这可确保所有相等性测试返回一致的结果。
发布于 2009-01-04 19:28:45
1)正如雷所说,当从不知道(静态地)实现IEquatable<T>的类调用方法时,覆盖Equals(object)以确保一致性。例如,非泛型集合类将使用Equals(object)进行比较。您还应该覆盖GetHashCode()。
2)实现IEquatable<T>不会自动重载==和!=运算符,但没有什么可以阻止您这样做,就像System.String一样。然而,如果你这样做了,你应该非常清楚地记录这一点-当你在其他类型的引用(例如MyType和Object)之间进行比较时要小心,这些引用仍然会使用身份比较。我怀疑这样做不是一个好主意,除非它在你的代码中是一个非常常用的类型,每个人都会对它非常熟悉,而且重载==的语法糖确实会对可读性产生积极的影响。
https://stackoverflow.com/questions/411500
复制相似问题