Comparteix a través de


CA1066: Implementar IEquatable al sobrescribir Equals

Propiedad Importancia
Identificador de la regla CA1066
Título Implementar IEquatable al sobreescribir Equals
Categoría Diseño
La corrección interrumpe o no interrumpe Sin interrupción
Habilitado de forma predeterminada en .NET 10 No
Idiomas aplicables C# y Visual Basic

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 invoquen el método System.IEquatable<T>.Equals fuertemente tipado y eviten la conversión de tipo (boxing) del argumento, lo que, a su vez, mejora el rendimiento. Para obtener más información, vea Notas para los implementadores.

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 sobrescritura de Equals para llamar a 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