CA1066: Implementar IEquatable al invalidar Equals

Propiedad Value
Identificador de la regla CA1066
Título Implementar IEquatable al invalidar Equals
Categoría Diseño
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 No

Causa

Un tipo de valor (struct) invalida el método Equals, pero no implementa IEquatable<T>.

Descripción de la regla

Un tipo de valor que invalida el método Equals indica que admite la comparación de dos instancias del tipo para la igualdad de valores. Considere la posibilidad de implementar la interfaz IEquatable<T> para admitir las pruebas fuertemente tipadas para determinar si son iguales. Esto garantiza que los llamadores que realizan comprobaciones de igualdad invocan el método System.IEquatable<T>.Equals fuertemente tipado y evitan la conversión boxing del argumento, lo que mejora el rendimiento. Para más información, consulte esta página.

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

Cómo corregir infracciones

Para corregir una infracción, implemente IEquatable<T> y actualice la invalidación de Equals para invocar este método implementado. Por ejemplo, en los dos fragmentos de código siguientes se muestra una infracción de la regla y cómo corregirla:

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

Cuándo suprimir las advertencias

Es seguro suprimir las infracciones de esta regla si el diseño y los beneficios de rendimiento de la implementación de la interfaz no son críticos.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

#pragma warning disable CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

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

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.

Consulte también