Compartilhar via


CA1066: Implementar IEquatable ao substituir Equals

Propriedade Valor
ID da regra CA1066
Título Implementar IEquatable ao substituir Equals
Categoria Design
Correção interruptiva ou sem interrupção Inquebrável
Habilitado por padrão no .NET 10 Não
Idiomas aplicáveis C# e Visual Basic

Causa

Um tipo de valor (struct) substitui o método Equals, mas não implementa IEquatable<T>.

Descrição da regra

Um tipo de valor que substitui o método Equals indica que ele suporta a comparação de duas instâncias do tipo para verificar 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 obter mais informações, consulte Anotações aos implementadores.

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 benefício no design e desempenho da implementação da interface não for essencial.

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.

Confira também