CA2231: sobrecarregar igualdades de operador em ValueType.Equals substituídos
TypeName |
OverloadOperatorEqualsOnOverridingValueTypeEquals |
CheckId |
CA2231 |
Categoria |
Microsoft.Usage |
Alteração Significativa |
Sem Quebra |
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 a linguagem de programação suporte sobrecargas do operador, você deve considerar implementar o operador de igualdade.O comportamento deve ser idêntico ao de Equals.
Você não pode usar o operador de igualdade padrão em uma implementação sobrecarregada do operador de igualdade.Isso causará um estouro de pilha.Para implementar o operador de igualdade, use o método de 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 Alertas
É seguro suprimir um aviso desta regra; no entanto, recomendamos que você forneça o operador de igualdade se possível.
Exemplo
O exemplo a seguir define um tipo que viola esta 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 igualdades de operador em tipos de referência
CA2225: as sobrecargas do operador têm alternativas nomeadas
CA2226: os operadores devem ter sobrecargas simétricas
CA2224: substituir igualdades em igualdades de operador de sobrecarga
CA2218: substituir GetHashCode em igualdades de substituição