CA2224: Eseguire l'override di Equals sull'operatore di overload uguale a
Proprietà | valore |
---|---|
ID regola | CA2224 |
Title | Eseguire l'override di Equals sull'operatore di overload uguale a |
Categoria | Utilizzo |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | Come suggerimento |
Causa
Un tipo pubblico implementa l'operatore di uguaglianza ma non esegue l'override di System.Object.Equals.
Descrizione regola
L'operatore di uguaglianza è progettato per essere un modo sintatticamente pratico per accedere alla funzionalità del Equals metodo. Se si implementa l'operatore di uguaglianza, la logica deve essere identica a quella di Equals.
Nota
Questa regola si applica solo al codice Visual Basic. Il compilatore C# genera un avviso separato, CS0660.
Come correggere le violazioni
Per correggere una violazione di questa regola, è necessario rimuovere l'implementazione dell'operatore di uguaglianza o eseguire l'override e fare in modo che i due metodi restituisca Equals gli stessi valori. Se l'operatore di uguaglianza non introduce un comportamento incoerente, è possibile correggere la violazione fornendo un'implementazione di Equals che chiama il Equals metodo nella classe base.
Quando eliminare gli avvisi
È possibile eliminare un avviso da questa regola se l'operatore di uguaglianza restituisce lo stesso valore dell'implementazione ereditata di Equals. Gli esempi in questo articolo includono un tipo che potrebbe eliminare in modo sicuro un avviso da questa regola.
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 CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224
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.CA2224.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.
Esempio
Nell'esempio seguente viene illustrata una classe (tipo riferimento) che viola questa regola.
' This class violates the rule.
Public Class Point
Public Property X As Integer
Public Property Y As Integer
Public Sub New(x As Integer, y As Integer)
Me.X = x
Me.Y = y
End Sub
Public Overrides Function GetHashCode() As Integer
Return HashCode.Combine(X, Y)
End Function
Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
If pt1 Is Nothing OrElse pt2 Is Nothing Then
Return False
End If
If pt1.GetType() <> pt2.GetType() Then
Return False
End If
Return pt1.X = pt2.X AndAlso pt1.Y = pt2.Y
End Operator
Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
Return Not pt1 = pt2
End Operator
End Class
Nell'esempio seguente viene risolta la violazione eseguendo l'override di System.Object.Equals.
' This class satisfies the rule.
Public Class Point
Public Property X As Integer
Public Property Y As Integer
Public Sub New(x As Integer, y As Integer)
Me.X = x
Me.Y = y
End Sub
Public Overrides Function GetHashCode() As Integer
Return HashCode.Combine(X, Y)
End Function
Public Overrides Function Equals(obj As Object) As Boolean
If obj = Nothing Then
Return False
End If
If [GetType]() <> obj.GetType() Then
Return False
End If
Dim pt As Point = CType(obj, Point)
Return X = pt.X AndAlso Y = pt.Y
End Function
Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
' Object.Equals calls Point.Equals(Object).
Return Object.Equals(pt1, pt2)
End Operator
Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
' Object.Equals calls Point.Equals(Object).
Return Not Object.Equals(pt1, pt2)
End Operator
End Class
Regole correlate
- CA1046: Non eseguire l'overload dell'operatore "uguale a" per i tipi di riferimento
- CA2218: Eseguire l'override di GetHashCode all'override di Equals
- CA2225: Gli overload degli operatori hanno alternative con nome
- CA2226: Gli operatori devono avere overload simmetrici
- CA2231: Eseguire l'overload dell'operatore "uguale a" all'override di ValueType.Equals