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 9 | 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.