Udostępnij za pośrednictwem


CA1066: Zaimplementuj interfejs IEquatable, gdy zastępujesz metodę Equals

Właściwości Wartość
Identyfikator reguły CA1066
Tytuł Zaimplementuj interfejs IEquatable przy przesłanianiu metody Equals
Kategoria Projektowanie
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

Przyczyna

Typ wartościowy (struktura) zastępuje metodę Equals, ale nie implementuje IEquatable<T>.

Opis reguły

Metoda zastępowania Equals typu wartości wskazuje, że obsługuje porównywanie dwóch wystąpień typu pod kątem równości wartości. Rozważ zaimplementowanie interfejsu IEquatable<T> w celu obsługi silnie typowanych testów na równość. Dzięki temu osoby wywołujące wykonujące kontrole równości wywołują silnie typizowaną System.IEquatable<T>.Equals metodę i unikają opakowywania argumentu, co poprawia wydajność. Aby uzyskać więcej informacji, zobacz Uwagi dotyczące implementatorów.

Implementacja System.IEquatable<T>.Equals powinna zwracać wyniki, które są zgodne z Equals.

Jak naprawić naruszenia

Aby naprawić naruszenie, zaimplementuj IEquatable<T> i zaktualizuj Equals przesłonięcia, aby wywołać tę zaimplementowaną metodę. Na przykład następujące dwa fragmenty kodu pokazują naruszenie reguły i sposób jego naprawy:

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

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć naruszenia z tej reguły, jeśli korzyści z projektowania i wydajności z implementacji interfejsu nie są krytyczne.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Zobacz też