CA1067: Remplacer Equals lors de l’implémentation d’IEquatable

Propriété Value
Identificateur de la règle CA1067
Titre Remplacer Equals lors de l’implémentation d’IEquatable
Catégorie Conception
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Comme suggestion

Cause

Un type implémente IEquatable<T>, mais ne remplace pas la méthode Equals.

Description de la règle

Un type implémentant l’interface IEquatable<T> indique qu’il prend en charge la comparaison de deux instances du type pour l’égalité. Vous devez également remplacer les implémentations de classes de base des méthodes Equals et GetHashCode() afin que leur comportement soit cohérent avec celui de l’implémentation de System.IEquatable<T>.Equals. Consultez ce document pour plus d’informations.

Votre implémentation de Equals doit retourner des résultats cohérents avec l’implémentation de System.IEquatable<T>.Equals.

Comment corriger les violations

Pour corriger une violation, remplacez Equals et implémentez-le en appelant l’implémentation System.IEquatable<T>.Equals. Par exemple, les deux extraits de code suivants montrent une violation de la règle et comment la corriger :

using System;

public struct S : IEquatable<S>
{
    private readonly int _value;
    public S(int f)
    {
        _value = f;
    }

    public bool Equals(S other)
        => _value == other._value;
}
using System;

public struct S : IEquatable<S>
{
    private readonly int _value;
    public S(int f)
    {
        _value = f;
    }

    public bool Equals(S other)
        => _value == other._value;

    public override bool Equals(object obj)
        => obj is S objS && Equals(objS);

    public override int GetHashCode()
        => _value.GetHashCode();
}

Quand supprimer les avertissements

Ne supprimez pas les violations de cette règle.

Voir aussi