Compartilhar via


CA2231: sobrecarregar igualdades de operador em ValueType.Equals substituídos

TypeName

OverloadOperatorEqualsOnOverridingValueTypeEquals

CheckId

CA2231

Categoria

Microsoft.Usage

Alteração Significativa

Sem Quebra

Causa

Um tipo de valor substitui Object.Equals mas não implementa o operador de igualdade.

Descrição da Regra

Na maioria das linguagens de programação não há nenhuma implementação padrão do operador de igualdade (==) para tipos de valor.Se a linguagem de programação suporte sobrecargas do operador, você deve considerar implementar o operador de igualdade.O comportamento deve ser idêntico ao de Equals.

Você não pode usar o operador de igualdade padrão em uma implementação sobrecarregada do operador de igualdade.Isso causará um estouro de pilha.Para implementar o operador de igualdade, use o método de Object.Equals em sua implementação.Por exemplo:

If (Object.ReferenceEquals(left, Nothing)) Then
    Return Object.ReferenceEquals(right, Nothing)
Else
    Return left.Equals(right)
End If
if (Object.ReferenceEquals(left, null)) 
    return Object.ReferenceEquals(right, null);
return left.Equals(right);

Como Corrigir Violações

Para corrigir uma violação desta regra, implemente o operador de igualdade.

Quando Suprimir Alertas

É seguro suprimir um aviso desta regra; no entanto, recomendamos que você forneça o operador de igualdade se possível.

Exemplo

O exemplo a seguir define um tipo que viola esta regra.

using System;

namespace UsageLibrary
{
    public struct PointWithoutHash
    {
        private int x,y;

        public PointWithoutHash(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public override string ToString()
        {
            return String.Format("({0},{1})",x,y);
        }

        public int X {get {return x;}}

        public int Y {get {return x;}}

        // Violates rule: OverrideGetHashCodeOnOverridingEquals. 
        // Violates rule: OverrideOperatorEqualsOnOverridingValueTypeEquals. 
        public override bool Equals (object obj)
        {
            if (obj.GetType() != typeof(PointWithoutHash))
                return false;

            PointWithoutHash p = (PointWithoutHash)obj;   
            return ((this.x == p.x) && (this.y == p.y));
        }

    }

}

Regras Relacionadas

CA1046: não sobrecarregar igualdades de operador em tipos de referência

CA2225: as sobrecargas do operador têm alternativas nomeadas

CA2226: os operadores devem ter sobrecargas simétricas

CA2224: substituir igualdades em igualdades de operador de sobrecarga

CA2218: substituir GetHashCode em igualdades de substituição

Consulte também

Referência

Object.Equals