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é par défaut dans .NET 8 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.

Voir aussi