CA2224: Przesłoń równa się przeciążeniu operatora
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2224 |
Tytuł | Zastąpij wartość Equals dla przeciążenia operatora równa się |
Kategoria | Użycie |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Jako sugestia |
Przyczyna
Typ publiczny implementuje operator równości, ale nie zastępuje System.Object.Equalselementu .
Opis reguły
Operator równości ma być składniowo wygodnym sposobem uzyskiwania dostępu do funkcji Equals metody. Jeśli implementujesz operator równości, jego logika musi być identyczna z operatorem Equals.
Uwaga
Ta reguła dotyczy tylko kodu Visual Basic. Kompilator języka C# generuje oddzielne ostrzeżenie CS0660.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, należy usunąć implementację operatora równości lub Equals przesłonić i zwrócić te same wartości. Jeśli operator równości nie wprowadza niespójnego zachowania, można naprawić naruszenie, zapewniając implementację Equals , która wywołuje Equals metodę w klasie bazowej.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli operator równości zwraca tę samą wartość co dziedziczona implementacja Equals. Przykłady w tym artykule zawierają typ, który może bezpiecznie pominąć ostrzeżenie z tej reguły.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykład
W poniższym przykładzie przedstawiono klasę (typ odwołania), która narusza tę regułę.
' 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
Poniższy przykład naprawia naruszenie przez zastąpienie .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
Powiązane reguły
- CA1046: Nie przeciążaj operatora równości w typach referencyjnych
- CA2218: Przesłoń metodę GetHashCode przy przesłanianiu metody Equals
- CA2225: Przeciążenia operatora mają nazwane alternatywy
- CA2226: Operatory powinny mieć symetryczne przeciążenia
- CA2231: Przeciążaj operator równości w przypadku przesłaniania metody ValueType.Equals