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
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.