Udostępnij za pośrednictwem


CA1066: Implementowanie funkcji IEquatable podczas zastępowania wartości Equals

Właściwości Wartość
Identyfikator reguły CA1066
Tytuł Zaimplementuj interfejs IEquatable przy przesłanianiu metody Equals
Kategoria Projekt
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 9 Nie.

Przyczyna

Metoda zastępowania typu wartości (struct), ale nie implementuje Equals IEquatable<T>metody .

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 w IEquatable<T> celu obsługi silnie typiowanych testów pod kątem równości. Dzięki temu osoby wywołujące wykonujące kontrole równości wywołują silnie typizowana System.IEquatable<T>.Equals metodę i unikają tworzenia pola argumentu, co poprawia wydajność. Więcej informacji można znaleźć tutaj.

Implementacja System.IEquatable<T>.Equals powinna zwracać wyniki 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ż