CA2231: Sobrecarga de operador equals em substituição a ValueType.Equals

TypeName

OverloadOperatorEqualsOnOverridingValueTypeEquals

CheckId

CA2231

<strong>Categoria</strong>

Microsoft.Usage

Alteração significativa

Não separável

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 sua linguagem de programação suportar sobrecargas de operador, você deve considerar a implementação do operador de igualdade. Seu comportamento deve ser idêntico do Equals.

É possível usar o operador de igualdade padrão em uma implementação de sobrecarga de operador de igualdade. Isso fará com que um estouro de pilha. Para implementar o operador de igualdade, use o método 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 avisos

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

Exemplo

O exemplo a seguir define um tipo que viole essa 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 o operador de equals em tipos de referência

CA2225: Sobrecargas de operador nomeou alternativas

CA2226: Os operadores devem ter sobrecargas simétricas

CA2224: É igual a substituição na sobrecarga de operador equals

CA2218: Substituir GetHashCode na substituição Equals

Consulte também

Referência

Object.Equals