CA1066: реализация IEquatable при переопределении Equals

Значение
Идентификатор правила CA1066
Категория Оформление
Исправление является критическим или не критическим Не критическое

Причина

Тип значения (структура) переопределяет метод Equals, но не реализует IEquatable<T>.

Описание правила

Метод переопределения типа значения Equals указывает, что он поддерживает сравнение двух экземпляров типа на равенство значений. Рассмотрите возможность реализации интерфейса IEquatable<T> для поддержки строго типизированных проверок на равенство. Это гарантирует, что вызывающие объекты, выполняющие проверки на равенство, вызывают строго типизированный метод System.IEquatable<T>.Equals и не выполняют упаковку-преобразование аргумента, что улучшает производительность. Дополнительные сведения см. здесь.

Ваша реализация System.IEquatable<T>.Equals должна возвращать результаты, которые соответствуют Equals.

Устранение нарушений

Чтобы устранить нарушение, реализуйте IEquatable<T> и обновите переопределение Equals, чтобы вызвать этот реализованный метод. В следующих двух фрагментах кода показано нарушение правила и способы его устранения:

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

Условия для отключения предупреждений

Можно отключить предупреждения из этого правила, если преимущества для проекта и производительности от реализации интерфейса не являются критическими.

См. также раздел