Partilhar via


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 8 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 para um arquivo, pasta ou projeto, defina sua severidade 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

Consulte também