Share via


CA2224: Åsidosätt lika med överlagringsoperatorn är lika med

Property Värde
Regel-ID CA2224
Title Åsidosätt lika med för överlagringsoperatorn är lika med
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

En offentlig typ implementerar likhetsoperatorn men åsidosätter System.Object.Equalsinte .

Regelbeskrivning

Likhetsoperatorn är avsedd att vara ett syntaktiskt bekvämt sätt att komma åt metodens Equals funktioner. Om du implementerar likhetsoperatorn måste dess logik vara identisk med den för Equals.

Kommentar

Den här regeln gäller endast för Visual Basic-kod. C#-kompilatorn genererar en separat varning, CS0660.

Så här åtgärdar du överträdelser

För att åtgärda ett brott mot den här regeln bör du antingen ta bort implementeringen av likhetsoperatorn eller åsidosätta Equals och låta de två metoderna returnera samma värden. Om likhetsoperatorn inte introducerar inkonsekvent beteende kan du åtgärda överträdelsen genom att tillhandahålla en implementering av Equals som anropar Equals metoden i basklassen.

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln om likhetsoperatorn returnerar samma värde som den ärvda implementeringen av Equals. Exemplen i den här artikeln innehåller en typ som på ett säkert sätt kan förhindra en varning från den här regeln.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Exempel

I följande exempel visas en klass (referenstyp) som bryter mot den här regeln.

' 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

I följande exempel åtgärdas överträdelsen genom att System.Object.Equalsåsidosätta .

' 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

Se även