CA2231: Sobrecarga de operador equals em substituição a 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 implementação do operador de igualdade. Seu comportamento deve ser idêntico do Equals.
É possível 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 de equals em tipos de referência
CA2225: Sobrecargas de operador nomeou alternativas
CA2226: Os operadores devem ter sobrecargas simétricas
CA2224: É igual a substituição na sobrecarga de operador equals
CA2218: Substituir GetHashCode na substituição Equals