问题
When I implement objects that I want to compare using the IEquatable<T> interface:
- Why do I have to override
Equals(object)
method if I already implementedEquals(T)
? - Can I use
==
and!=
operators once I implementIEquatable<T>
?
回答1:
From MS Docs article on IEquatable<T>:
If you implement
IEquatable<T>
, you should also override the base class implementations ofEquals(Object)
andGetHashCode()
so that their behavior is consistent with that of theEquals(T)
method. If you do overrideEquals(Object)
, your overridden implementation is also called in calls to the staticEquals(Object, Object)
method on your class. In addition, you should overload theop_Equality
andop_Inequality
operators. This ensures that all tests for equality return consistent results.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