Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| 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.