Compartir a través de


CA2231: Sobrecargar el operador de igualdad al reemplazar el tipo de valor de igualdad

Nombre de tipo

OverloadOperatorEqualsOnOverridingValueTypeEquals

Identificador de comprobación

CA2231

Categoría

Microsoft.Usage

Cambio problemático

No

Motivo

Un tipo de valor reemplaza Object.Equals pero no implementa al operador de igualdad.

Descripción de la regla

En la mayoría de los lenguajes de programación no hay una implementación predeterminada del operador de igualdad (==) para tipos de valor.Si su lenguaje de programación admite las sobrecargas de operador, debería considerar implementar el operador de igualdad.Su comportamiento debería ser idéntico al de Equals.

No puede utilizar el operador de igualdad predeterminado en una implementación sobrecargada del operador de igualdad.Con ello se producirá un desbordamiento de pila.Para implementar el operador de igualdad, utilice el método Object.Equals en la implementación.Por ejemplo:

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);

Cómo corregir infracciones

Para corregir una infracción de esta regla, implemente el operador de igualdad.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla; sin embargo, se recomienda proporcionar el operador de igualdad, si es posible.

Ejemplo

El siguiente ejemplo se define un tipo que infringe esta regla.

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));
        }

    }

}

Reglas relacionadas

CA1046: No sobrecargar el operador de igualdad en los tipos de referencia

CA2225: Las sobrecargas del operador tienen alternativas con nombre

CA2226: Los operadores deben tener sobrecargar simétricas

CA2224: Reemplazar Equals al sobrecargar operadores de igualdad

CA2218: Reemplazar el método GetHashCode al reemplazar el método Equals

Vea también

Referencia

Object.Equals