CA2224: Přepsat Rovná se při přetížení operátor rovná se
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2224 |
Název | Přepsat Equals při přetížení operátor rovná se |
Kategorie | Využití |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 8 | Jako návrh |
Příčina
Veřejný typ implementuje operátor rovnosti, ale nepřepíše System.Object.Equals.
Popis pravidla
Operátor rovnosti je určen jako syntakticky pohodlný způsob přístupu k funkcím Equals metody. Pokud implementujete operátor rovnosti, musí být jeho logika shodná s operátorem Equals.
Poznámka:
Toto pravidlo platí jenom pro kód jazyka Visual Basic. Kompilátor jazyka C# vygeneruje samostatné upozornění CS0660.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, měli byste buď odebrat implementaci operátoru rovnosti, nebo přepsat Equals a mít dvě metody vracejí stejné hodnoty. Pokud operátor rovnosti nezavádí nekonzistentní chování, můžete opravit porušení tím, že zadáte implementaci Equals , která volá metodu Equals v základní třídě.
Kdy potlačit upozornění
Je bezpečné potlačit upozornění z tohoto pravidla, pokud operátor rovnosti vrátí stejnou hodnotu jako zděděná implementace Equals. Příklady v tomto článku obsahují typ, který by mohl bezpečně potlačit upozornění z tohoto pravidla.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Příklad
Následující příklad ukazuje třídu (typ odkazu), která porušuje toto pravidlo.
' 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
Následující příklad opravuje porušení přepsáním 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
Související pravidla
- CA1046: Nepřetěžujte operátory rovnosti na odkazových typech
- CA2218: Přepište GetHashCode při přepsání Equals
- CA2225: Přetížení operátoru mají pojmenované alternativy
- CA2226: Operátory by měly mít symetrické přetížení
- CA2231: Přetižte operátor equals při přepsání ValueType.Equals