Question
Lorsque j'implémente des objets que je souhaite comparer à l'aide de l'élément IEquatable<T>
interface :
- Pourquoi dois-je remplacer la
Equals(object)
méthode si j'ai déjà implémentéEquals(T)
? - Puis-je utiliser les opérateurs
==
et!=
après avoir implémenté <=>?
La solution
-
De MS Article de Google Documents sur
IEquatable<T>
:Si vous implémentez
Equals(Object)
, vous devez également remplacer le implémentations de classe de base deGetHashCode()
etEquals(T)
pour que leur comportement soit cohérent avec celui de laEquals(Object, Object)
méthode. Si vous annulezop_Equality
votre implémentation surchargée est également appelé dans les appels à la statiqueop_Inequality
méthode sur votre classe. En outre, vous devriez surcharger le <=> et <=> opérateurs. Cela garantit que tous les tests d'égalité retourner des résultats cohérents. -
Non, les opérateurs n'utilisent pas la méthode Equals . Ils doivent être surchargés séparément faire ainsi.
Autres conseils
1) Comme l'a dit Ray, remplacez Equals(object)
pour assurer la cohérence lorsque la méthode est appelée à partir de classes qui ne savent pas (de manière statique) que vous implémentez IEquatable<T>
. Par exemple, les classes de collections non génériques utiliseront GetHashCode()
pour les comparaisons. Vous devez également remplacer System.String
.
2) L'implémentation de <=> ne surcharge pas automatiquement les opérateurs == et! =, mais rien ne vous en empêche, tout comme le fait <=>. Vous devez cependant documenter cela très clairement si vous le faites - et soyez prudent lorsque vous effectuez des comparaisons entre d'autres types de référence (par exemple, MyType et Object) qui continueront à utiliser la comparaison d'identité. Je suppose que ce n’est pas une bonne idée de faire cela à moins que ce ne soit un type très utilisé dans votre code, où tout le monde en deviendra très familier et où le sucre syntaxique de surcharge == sera vraiment avoir un impact positif sur la lisibilité.