Compartir vía


CA1067: Invalidar Equals al implementar IEquatable

Propiedad Value
Identificador de la regla CA1067
Título Invalidar Equals al implementar IEquatable
Categoría Diseño
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como sugerencia

Causa

Un tipo implementa IEquatable<T>, pero no invalida el método Equals.

Descripción de la regla

Un tipo que implementa una interfaz IEquatable<T> indica que admite la comparación de dos instancias del tipo para determinar si son iguales. También debe invalidar las implementaciones de clase base de los métodos Equals y GetHashCode() para que su comportamiento sea coherente con el de la implementación de System.IEquatable<T>.Equals. Obtenga más información aquí.

La implementación de Equals debe devolver resultados coherentes con la de System.IEquatable<T>.Equals.

Cómo corregir infracciones

Para corregir una infracción, invalide Equals e impleméntelo mediante la invocación de la implementación de System.IEquatable<T>.Equals. Por ejemplo, en los dos fragmentos de código siguientes se muestra una infracción de la regla y cómo corregirla:

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();
}

Cuándo suprimir las advertencias

No suprima las infracciones de esta regla.

Consulte también