Condividi tramite


CA1066: Implementare IEquatable quando si esegue l'override di Equals

Proprietà valore
ID regola CA1066
Titolo Implementare IEquatable quando si esegue l'override di Equals
Categoria Progettazione
La correzione causa un'interruzione o meno Non rompente
Abilitato per impostazione predefinita in .NET 10 NO
Linguaggi applicabili C# e Visual Basic

Causa

Un tipo di valore (struct) esegue l'override del metodo Equals, ma non implementa IEquatable<T>.

Descrizione regola

Un metodo di override Equals del tipo di valore indica che supporta il confronto di due istanze del tipo per l'uguaglianza dei valori. Considerare l'implementazione dell' IEquatable<T> interfaccia per supportare test di uguaglianza fortemente tipizzati. In questo modo, i chiamanti che eseguono controlli di uguaglianza richiamano il metodo fortemente tipizzato System.IEquatable<T>.Equals ed evitano il ricorso al boxing dell'argomento, migliorando le prestazioni. Per altre informazioni, vedere Note per gli implementatori.

L'implementazione System.IEquatable<T>.Equals deve restituire risultati coerenti con Equals.

Come correggere le violazioni

Per correggere una violazione, implementare IEquatable<T> e aggiornare Equals l'override per richiamare questo metodo implementato. Ad esempio, i due frammenti di codice seguenti mostrano una violazione della regola e come risolverli:

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;
}

Quando eliminare gli avvisi

È sicuro sopprimere le violazioni di questa regola se i benefici per la progettazione e le prestazioni derivanti dall'implementazione dell'interfaccia non sono critici.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

#pragma warning disable CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

[*.{cs,vb}]
dotnet_diagnostic.CA1066.severity = none

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Vedi anche