CA1066: Implementar IEquatable ao substituir Equals
Property | Valor |
---|---|
ID da regra | CA1066 |
Título | Implementar IEquatable ao substituir Equals |
Categoria | Projetar |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Não |
Causa
Um tipo de valor (struct) substitui o método Equals, mas não implementa IEquatable<T>.
Descrição da regra
Um método Equals de substituição de tipo de valor indica que ele dá suporte à comparação de duas instâncias do tipo para igualdade de valor. Considere implementar a interface IEquatable<T> para dar suporte a testes fortemente tipados para igualdade. Isso garante que os chamadores que executam verificações de igualdade invoquem o método fortemente tipado System.IEquatable<T>.Equals e evitem fazer a conversão boxing do argumento, melhorando o desempenho. Para mais informações, consulte aqui.
Sua implementação System.IEquatable<T>.Equals deve retornar resultados consistentes com Equals.
Como corrigir violações
Para corrigir uma violação, implemente IEquatable<T> e atualize a substituição Equals para invocar esse método implementado. Por exemplo, os dois seguintes snippets de código mostram uma violação da regra e como corrigi-la:
public struct S
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && _value == otherS._value;
}
using System;
public struct S : IEquatable<S>
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && Equals(otherS);
public bool Equals(S other)
=> _value == other._value;
}
Quando suprimir avisos
É seguro suprimir violações dessa regra se o design e o desempenho se beneficiarem da implementação da interface não forem essenciais.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.
#pragma warning disable CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066
Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1066.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.