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 9 | 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
Relaterade regler
- CA1046: Överlagrar inte operatorn är lika med referenstyper
- CA2218: Åsidosätt GetHashCode vid åsidosättande av lika med
- CA2225: Operatoröverlagringar har namngett alternativ
- CA2226: Operatorer bör ha symmetriska överlagringar
- CA2231: Överlagringsoperatorn är lika med vid åsidosättande av ValueType.Equals