Condividi tramite


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

Vedi anche