Understanding IEquatable

拈花ヽ惹草 提交于 2019-12-17 15:34:56

问题


When I implement objects that I want to compare using the IEquatable<T> interface:

  1. Why do I have to override Equals(object) method if I already implemented Equals(T)?
  2. Can I use == and != operators once I implement IEquatable<T>?

回答1:


  1. From MS Docs article on IEquatable<T>:

    If you implement IEquatable<T>, 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.

  2. No, operators do not use the Equals method. They must be overloaded separately to do so.




回答2:


1) As Ray said, override Equals(object) to ensure consistency when the method is called from classes which don't know (statically) that you implement IEquatable<T>. For instance, the non-generic collections classes will use Equals(object) for comparisons. You should also override GetHashCode().

2) Implementing IEquatable<T> doesn't overload the == and != operators automatically, but there's nothing to stop you from doing so, just like System.String does. You should document this very clearly if you do, however - and be careful when you make comparisons between other types of reference (e.g. MyType and Object) which will still use the identity comparison. I suspect it's not a great idea to do this unless it's going to be a very heavily used type in your code, where everyone will become very familiar with it and where the syntactic sugar of overloading == will really make a positive impact on readability.



来源:https://stackoverflow.com/questions/411500/understanding-iequatable

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!