CA2224: Przesłoń równa się przeciążeniu operatora

Właściwości Wartość
Identyfikator reguły CA2224
Tytuł Zastąpij wartość Equals dla przeciążenia operatora równa się
Kategoria Użycie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako sugestia

Przyczyna

Typ publiczny implementuje operator równości, ale nie zastępuje System.Object.Equalselementu .

Opis reguły

Operator równości ma być składniowo wygodnym sposobem uzyskiwania dostępu do funkcji Equals metody. Jeśli implementujesz operator równości, jego logika musi być identyczna z operatorem Equals.

Uwaga

Ta reguła dotyczy tylko kodu Visual Basic. Kompilator języka C# generuje oddzielne ostrzeżenie CS0660.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy usunąć implementację operatora równości lub Equals przesłonić i zwrócić te same wartości. Jeśli operator równości nie wprowadza niespójnego zachowania, można naprawić naruszenie, zapewniając implementację Equals , która wywołuje Equals metodę w klasie bazowej.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli operator równości zwraca tę samą wartość co dziedziczona implementacja Equals. Przykłady w tym artykule zawierają typ, który może bezpiecznie pominąć ostrzeżenie z tej reguły.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

#pragma warning disable CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykład

W poniższym przykładzie przedstawiono klasę (typ odwołania), która narusza tę regułę.

' 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

Poniższy przykład naprawia naruszenie przez zastąpienie .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

Zobacz też