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


CA1067: переопределение равно при реализации IEquatable

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

Причина

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

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

Интерфейс IEquatable<T>, реализующий тип, указывает, что он поддерживает сравнение двух экземпляров типа на равенство. Также следует переопределить реализации методов Equals и GetHashCode() в базовом классе, чтобы их поведение соответствовало их поведению в реализации System.IEquatable<T>.Equals. Подробнее см. здесь.

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

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

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

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

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

Не отключайте предупреждения для этого правила.

См. также