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.