Compartilhar via


CA1067: Sobrescrever Equals ao implementar IEquatable

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

Causa

Um tipo implementa IEquatable<T>, mas não substitui o método Equals.

Descrição da regra

Um tipo que implementa a interface IEquatable<T> indica que ele oferece suporte à comparação de duas instâncias do tipo para igualdade. Você também deve substituir as implementações de classe base dos métodos Equals e GetHashCode() para que seu comportamento seja consistente com o da implementação System.IEquatable<T>.Equals. Para obter mais informações, consulte Anotações aos implementadores.

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

Como corrigir violações

Para corrigir uma violação, substitua Equals e implemente-o invocando a implementação System.IEquatable<T>.Equals. Por exemplo, os dois snippets de código a seguir mostram uma violação da regra e como corrigi-la:

using System;

public struct S : IEquatable<S>
{
    private readonly int _value;
    public S(int f)
    {
        _value = f;
    }

    public bool Equals(S other)
        => _value == other._value;
}
using System;

public struct S : IEquatable<S>
{
    private readonly int _value;
    public S(int f)
    {
        _value = f;
    }

    public bool Equals(S other)
        => _value == other._value;

    public override bool Equals(object obj)
        => obj is S objS && Equals(objS);

    public override int GetHashCode()
        => _value.GetHashCode();
}

Quando suprimir avisos

Não suprima as violações dessa regra.

Confira também