Nota
L'accés a aquesta pàgina requereix autorització. Podeu provar d'iniciar la sessió o de canviar els directoris.
L'accés a aquesta pàgina requereix autorització. Podeu provar de canviar els directoris.
| 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.