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
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Un tipo valore (struct) esegue l'override Equals del metodo , 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. Valutare la possibilità di implementare l'interfaccia per supportare test fortemente tipizzato per verificarne l'uguaglianza IEquatable<T> . In questo modo, i chiamanti che eseguono controlli di uguaglianza richiamano il metodo fortemente tipizzato System.IEquatable<T>.Equals ed evitano il boxing dell'argomento, migliorando le prestazioni. Per ulteriori informazioni, vedi qui.

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 eliminare le violazioni da questa regola se la progettazione e le prestazioni traggono vantaggio dall'implementazione dell'interfaccia non sono critiche.

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