CA2224: Substituir igual a sobrecarga do operador é igual a
Property | valor |
---|---|
ID da regra | CA2224 |
Título | Substituir igual a sobrecarga do operador é igual a |
Categoria | Utilização |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Como sugestão |
Motivo
Um tipo público implementa o operador de igualdade, mas não substitui System.Object.Equals.
Descrição da regra
O operador de igualdade destina-se a ser uma maneira sintaticamente conveniente de acessar a funcionalidade do Equals método. Se você implementar o operador de igualdade, sua lógica deverá ser idêntica à do Equals.
Nota
Esta regra só se aplica ao código do Visual Basic. O compilador C# gera um aviso separado, CS0660.
Como corrigir violações
Para corrigir uma violação dessa regra, você deve remover a implementação do operador de igualdade ou substituir Equals e fazer com que os dois métodos retornem os mesmos valores. Se o operador de igualdade não introduzir um comportamento inconsistente, você poderá corrigir a violação fornecendo uma implementação que Equals chame o Equals método na classe base.
Quando suprimir avisos
É seguro suprimir um aviso dessa regra se o operador de igualdade retornar o mesmo valor que a implementação herdada de Equals. Os exemplos neste artigo incluem um tipo que pode suprimir com segurança um aviso dessa regra.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Exemplo
O exemplo a seguir mostra uma classe (tipo de referência) que viola essa regra.
' 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
O exemplo a seguir corrige a violação substituindo System.Object.Equalso .
' 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
Regras conexas
- CA1046: Não sobrecarregar operador igual em tipos de referência
- CA2218: Substituir GetHashCode ao substituir Equals
- CA2225: As sobrecargas do operador nomearam suplentes
- CA2226: Os operadores devem ter sobrecargas simétricas
- CA2231: Operador de sobrecarga é igual ao substituir ValueType.Equals