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