CA1066: Implementace IEquatable při přepisování metody Equals

Vlastnost Hodnota
ID pravidla CA1066
Název Při přepisu Equals implementujte IEquatable.
Kategorie Návrh
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

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 silně typovaných testů rovnosti. Tím se zajistí, že volající provádějící kontroly rovnosti vyvolávají metodu silného typu System.IEquatable<T>.Equals, čímž se zabrání boxování argumentu a zlepšuje se výkon. Další informace naleznete v poznámkách implementátorů.

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í pravidla, implementujte IEquatable<T> a aktualizujte Equals přepsání pro volá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é