Partilhar via


CA2231: Sobrecarga de operador é igual a sobre a anulação de 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 implementar o operador de igualdade.Seu comportamento deve ser idêntico do Equals.

Você não pode 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 equals em tipos de referência

CA2225: Sobrecargas operador nomeou alternativas

CA2226: Os operadores devem ter a sobrecargas simétricas

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

CA2218: GetHashCode de substituição em substituição Equals

Consulte também

Referência

Object.Equals