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.