CA1067: Substituir Equals ao implementar IEquatable

Property Valor
ID da regra CA1067
Título Substituir Equals ao implementar IEquatable
Categoria Projetar
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

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

Descrição da regra

Uma interface de implementação de tipo IEquatable<T> indica que ela 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. Veja aqui para obter mais detalhes.

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