Compartir a través de


Sobrecargar el operador de igualdad al invalidar ValueType.Equals

Actualización: noviembre 2007

Nombre de tipo

OverloadOperatorEqualsOnOverridingValueTypeEquals

Identificador de comprobación

CA2231

Categoría

Microsoft.Usage

Cambio problemático

No problemático

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 un modelo de 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 al 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

No sobrecargar el operador Equals en tipos de referencia

Las sobrecargas del operador tienen alternativas con nombre

Los operadores deben tener sobrecargar simétricas

Reemplazar Equals al sobrecargar el operador de igualdad

Reemplazar GetHashCode en el método reemplazable Equals

Vea también

Referencia

Object.Equals