Поделиться через


CA1066: реализуйте IEquatable при переопределении "Равно"

Свойство Значение
Идентификатор правила CA1066
Заголовок реализация IEquatable при переопределении Equals
Категория Проектирование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

Тип значения (структура) переопределяет метод 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;
}

Когда лучше отключить предупреждения

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

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA1066.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

См. также