当我使用IEquatable<T>接口实现我想要比较的对象时:
Equals(object)如果我已经实现了,为什么必须覆盖方法Equals(T)?==和!=运营商IEquatable<T>吗?Ray*_*sen 52
如果实现了
IEquatable<T>,你也应该重写的基类的实现Equals(Object),并GetHashCode()让他们的行为与该一致的Equals(T)方法.如果覆盖Equals(Object),则在调用类上的静态Equals(Object, Object)方法时也会调用重写的实现 .此外,您应该重载op_Equality和op_Inequality运算符.这可确保所有相等测试都返回一致的结果.
不,运营商不使用Equals方法.它们必须单独超载才能这样做.
Jon*_*eet 43
1)正如Ray所说,覆盖Equals(object)以确保从不知道(静态)实现的类调用方法时的一致性IEquatable<T>.例如,非泛型集合类将Equals(object)用于比较.你也应该覆盖GetHashCode().
2)实现IEquatable<T>不会自动重载==和!=运算符,但没有什么可以阻止你这样做,就像System.String那样.但是,如果你这样做,你应该非常清楚地记录这一点 - 当你在仍然使用身份比较的其他类型的引用(例如MyType和Object)之间进行比较时要小心.我怀疑这样做并不是一个好主意,除非它在你的代码中是一个非常频繁使用的类型,每个人都会非常熟悉它,并且重载的语法糖= =将真正对可读性产生积极影响.