CA1066 : Implémenter IEquatable au moment de remplacer Equals
Propriété | Value |
---|---|
Identificateur de la règle | CA1066 |
Titre | Implémenter IEquatable au moment de remplacer Equals |
Catégorie | Conception |
Le correctif est cassant ou non cassant | Sans rupture |
Activée par défaut dans .NET 9 | Non |
Cause
Un type valeur (struct) substitue la méthode Equals, mais n’implémente pas IEquatable<T>.
Description de la règle
Un type valeur substituant la méthode Equals indique qu’il prend en charge la comparaison de l’égalité des valeurs de deux instances du type. Implémentez l’interface IEquatable<T> pour prendre en charge des tests d’égalité fortement typés. Cela garantit que les appelants qui effectuent des vérifications d’égalité appellent la méthode fortement typée System.IEquatable<T>.Equals et évitent de boxer l’argument, ce qui améliore les performances. Vous pourrez trouver plus d’informations ici.
Votre implémentation de System.IEquatable<T>.Equals doit retourner des résultats cohérents avec Equals.
Comment corriger les violations
Pour corriger une violation, implémentez IEquatable<T> et mettez à jour la substitution Equals de façon à appeler cette méthode implémentée. Par exemple, les deux extraits de code suivants montrent une violation de la règle et comment la corriger :
public struct S
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && _value == otherS._value;
}
using System;
public struct S : IEquatable<S>
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && Equals(otherS);
public bool Equals(S other)
=> _value == other._value;
}
Quand supprimer les avertissements
Vous pouvez sans risque supprimer les violations de cette règle si les avantages en matière de conception et de performances liés à l’implémentation de l’interface ne sont pas critiques.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA1066.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.