CA2224: Onderdrukking is gelijk aan overbelastingsoperator is gelijk aan
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2224 |
Titel | Onderdrukking is gelijk aan overbelastingsoperator is gelijk aan |
Categorie | Gebruik |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Als suggestie |
Oorzaak
Een openbaar type implementeert de gelijkheidsoperator, maar overschrijft System.Object.Equalsdeze niet.
Beschrijving van regel
De gelijkheidsoperator is bedoeld als een syntactisch handige manier om toegang te krijgen tot de functionaliteit van de Equals methode. Als u de gelijkheidsoperator implementeert, moet de logica ervan identiek zijn aan die van Equals.
Notitie
Deze regel is alleen van toepassing op Visual Basic-code. De C#-compiler genereert een afzonderlijke waarschuwing, CS0660.
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, moet u de implementatie van de gelijkheidsoperator verwijderen of overschrijven Equals en de twee methoden dezelfde waarden laten retourneren. Als de gelijkheidsoperator geen inconsistent gedrag introduceert, kunt u de schending oplossen door een implementatie van Equals die methode Equals in de basisklasse aan te roepen.
Wanneer waarschuwingen onderdrukken
Het is veilig om een waarschuwing van deze regel te onderdrukken als de gelijkheidsoperator dezelfde waarde retourneert als de overgenomen implementatie van Equals. De voorbeelden in dit artikel bevatten een type dat een waarschuwing van deze regel veilig kan onderdrukken.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.
Opmerking
In het volgende voorbeeld ziet u een klasse (verwijzingstype) die deze regel schendt.
' 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
In het volgende voorbeeld wordt de schending opgelost door deze te overschrijven 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
Gerelateerde regels
- CA1046: Operator voor overbelasting is niet gelijk aan verwijzingstypen
- CA2218: GetHashCode overschrijven bij het overschrijven van Equals
- CA2225: Overbelastingen van operatoren hebben alternatieve namen
- CA2226: Operators moeten symmetrische overbelastingen hebben
- CA2231: De operator Overbelasting is gelijk aan het overschrijven van ValueType.Equals