Megosztás a következőn keresztül:


CA2224: A felülbírálás egyenlő a túlterhelési operátoron

Tulajdonság Érték
Szabályazonosító CA2224
Cím A felülbírálás egyenlő a túlterhelési operátoron
Kategória Használat
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Javaslatként

Ok

A nyilvános típus implementálja az egyenlőségi operátort, de nem bírálja felül System.Object.Equals.

Szabály leírása

Az egyenlőségi operátor a módszer funkcióinak Equals elérésére szolgáló szintaktikailag kényelmes módszer. Ha az egyenlőségi operátort implementálja, annak logikájának meg kell egyeznie Equalsa .

Megjegyzés:

Ez a szabály csak a Visual Basic-kódra vonatkozik. A C#-fordító külön figyelmeztetést hoz létre: CS0660.

Szabálysértések kijavítása

A szabály megsértésének kijavításához távolítsa el az egyenlőségi operátor implementációját, vagy felülbírálja Equals , és a két metódus ugyanazokat az értékeket adja vissza. Ha az egyenlőségi operátor nem vezet be inkonzisztens viselkedést, kijavíthatja a szabálysértést az alaposztály metódusát meghívó Equals metódus implementációjának Equals megadásával.

Mikor kell letiltani a figyelmeztetéseket?

A szabály figyelmeztetését nyugodtan letilthatja, ha az egyenlőségi operátor ugyanazt az értéket adja vissza, mint a szabály öröklött implementációja Equals. A cikkben szereplő példák olyan típust tartalmaznak, amely biztonságosan letilthatja a szabály figyelmeztetését.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.

Példa

Az alábbi példa egy olyan osztályt (referenciatípust) mutat be, amely megsérti ezt a szabályt.

' 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

Az alábbi példa felülírással oldja meg a szabálysértést 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

Kapcsolódó információk