CA1066: Implementace IEquatable při přepsání Equals

Vlastnost Hodnota
ID pravidla CA1066
Název Při přepisu Equals implementujte IEquatable.
Kategorie Návrh
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Typ hodnoty (struktura) přepisuje Equals metodu, ale neimplementuje IEquatable<T>.

Popis pravidla

Metoda přepsání Equals typu hodnoty označuje, že podporuje porovnávání dvou instancí typu pro rovnost hodnot. Zvažte implementaci IEquatable<T> rozhraní pro podporu testů silného typu pro rovnost. Tím se zajistí, že volající provádějící kontroly rovnosti vyvolá metodu silného typu System.IEquatable<T>.Equals a zabrání boxování argumentu a zlepší výkon. Další informace najdete tady.

Vaše System.IEquatable<T>.Equals implementace by měla vrátit výsledky, které jsou konzistentní s Equals.

Jak opravit porušení

Chcete-li opravit porušení, implementujte IEquatable<T> a aktualizujte Equals přepsání pro vyvolání této implementované metody. Například následující dva fragmenty kódu ukazují porušení pravidla a postup jeho opravy:

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

Kdy potlačit upozornění

Je bezpečné potlačit porušení tohoto pravidla, pokud návrh a výkon výhody implementace rozhraní nejsou kritické.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Viz také