关于c#:了解IEquatable

Understanding IEquatable

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

  • 如果我已经实现了Equals(T),为什么要重写Equals(object)方法?
  • 在实现IEquatable之后,我可以使用==!=操作符吗?

  • 摘自MS Docs关于IEquatable的文章:


    If you implement IEquatable, you should also override the
    base class implementations of
    Equals(Object) and
    GetHashCode() so that their behavior is
    consistent with that of the
    Equals(T)
    method. If you do override
    Equals(Object), your
    overridden implementation is also
    called in calls to the static
    Equals(Object, Object)
    method on your class. In addition,
    you should overload the op_Equality
    and op_Inequality operators.
    This ensures that all tests for equality
    return consistent results.

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


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

    2)实现IEquatable不会重载==和!=自动操作,但没有什么可以阻止您这样做,就像System.String所做的那样。但是,如果这样做的话,您应该非常清楚地记录这一点,并且在比较仍将使用标识比较的其他引用类型(如mytype和object)时要小心。我怀疑这样做不是一个好主意,除非它将在您的代码中被大量使用,在那里每个人都将变得非常熟悉它,在那里重载==的语法结构将真正对可读性产生积极影响。