Partilhar via


CA1066: Implemente o IEquatable ao substituir Igual

Property valor
ID da regra CA1066
Título Implementar o IEquatable ao substituir Equals
Categoria Desenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 9 Não

Motivo

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

Descrição da regra

Um método de substituição Equals de tipo de valor indica que ele suporta a comparação de duas instâncias do tipo para igualdade de valor. Considere a implementação da IEquatable<T> interface para suportar testes de igualdade fortemente tipados. Isso garante que os chamadores que executam verificações de igualdade invoquem o método fortemente tipado System.IEquatable<T>.Equals e evitem encaixotar o argumento, melhorando o desempenho. Para obter mais informações, veja aqui.

Sua System.IEquatable<T>.Equals implementação deve retornar resultados consistentes com Equalso .

Como corrigir violações

Para corrigir uma violação, implemente IEquatable<T> e atualize Equals a substituição para invocar esse método implementado. Por exemplo, os dois trechos de código a seguir 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 os benefícios de design e desempenho da implementação da interface não forem críticos.

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 CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA1066.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Consulte também