CA2231: Operador de sobrecarga é igual ao substituir ValueType.Equals
Property | valor |
---|---|
ID da regra | CA2231 |
Título | O operador de sobrecarga é igual ao substituir ValueType.Equals |
Categoria | Utilização |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 8 | Como sugestão |
Motivo
Um tipo de valor substitui, System.Object.Equals mas não implementa o operador de igualdade.
Por padrão, essa regra examina apenas tipos visíveis externamente, mas isso é configurável.
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 suporta sobrecargas de operador, você deve considerar a implementação do operador de igualdade. O seu comportamento deve ser idêntico ao da Equals.
Não é possível 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 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 suprimir uma advertência desta regra; no entanto, recomendamos que forneça o operador de igualdade, se possível.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable CA2231
// The code that's violating the rule is on this line.
#pragma warning restore CA2231
Para desabilitar a regra para um arquivo, pasta ou projeto, defina sua severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2231.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Configurar código para análise
Use a opção a seguir para configurar em quais partes da base de código executar essa regra.
Você pode configurar essa opção apenas para esta regra, para todas as regras às quais ela se aplica ou para todas as regras nesta categoria (Uso) às quais ela se aplica. Para obter mais informações, consulte Opções de configuração da regra de qualidade de código.
Incluir superfícies de API específicas
Você pode configurar em quais partes da sua base de código executar essa regra, com base em sua acessibilidade. Por exemplo, para especificar que a regra deve ser executada somente na superfície de API não pública, adicione o seguinte par chave-valor a um arquivo .editorconfig em seu projeto:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Exemplo
O exemplo a seguir define um tipo que viola essa regra:
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 conexas
- CA1046: Não sobrecarregar operador igual em tipos de referência
- CA2225: As sobrecargas do operador nomearam suplentes
- CA2226: Os operadores devem ter sobrecargas simétricas