了解IEquatable

如果我想比较对象,他们实现了IEquatable <>接口,我有几个问题:

  1. 为什么我必须重写Equals(object),如果我必须实现Equals <>
  2. 我可以使用==和!=一旦我实现IEquatable?

关于#1:

来自MSDN:

如果实现IEquatable<T> ,则还应该重写Object::Equals(Object)GetHashCode()的基类实现,以使其行为与IEquatable<T>::Equals方法的行为一致。 如果您重写Object::Equals(Object) ,那么您的类的静态Equals(System.Object, System.Object)方法的调用中也会调用重写的实现。 这确保Equals()方法的所有调用返回一致的结果。

2)不,这些做简单的参考比较,不要使用Equals方法。

1)正如Ray所说,覆盖Equals(object)以确保一致性,当方法从不知道(静态地)知道实现IEquatable<T>类中调用时。 例如,非generics集合类将使用Equals(object)进行比较。 你也应该重写GetHashCode()

2)实现IEquatable<T>不会自动重载==和!=运算符,但没有什么可以阻止你这样做,就像System.String一样。 如果你这样做的话,你应该非常清楚地logging下来,并且当你在其他types的引用(比如MyType和Object)之间进行比较的时候要小心,它们仍然会使用标识符比较。 我怀疑这样做不是一个好主意,除非它会成为代码中非常常用的types,每个人都会对它非常熟悉, 并且重载的语法糖在真正会对可读性产生积极影响的地方。