CA1066: „IEquatable“ beim Außerkraftsetzen von „Equals“ implementieren

Eigenschaft Wert
Regel-ID CA1066
Titel „IEquatable“ beim Außerkraftsetzen von „Equals“ implementieren
Kategorie Design
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Nein

Ursache

Ein Wertetyp („struct“) überschreibt die Methode Equals, implementiert aber nicht IEquatable<T>.

Regelbeschreibung

Ein Wertetyp, der die Methode Equals überschreibt, zeigt an, dass er den Vergleich zweier Instanzen des Typs auf Wertgleichheit unterstützt. Sie sollten erwägen, die IEquatable<T>-Schnittstelle zu implementieren, um stark typisierte Tests auf Gleichheit zu unterstützen. Dadurch wird sichergestellt, dass Aufrufer, die Gleichheitstests durchführen, die stark typisierte System.IEquatable<T>.Equals-Methode aufrufen und das Boxing des Arguments vermeiden, was die Leistung verbessert. Weitere Informationen finden Sie hier.

Ihre System.IEquatable<T>.Equals-Implementierung sollte Ergebnisse zurückgeben, die Equals entsprechen.

Behandeln von Verstößen

Um einen Verstoß zu beheben, implementieren Sie IEquatable<T> und aktualisieren Sie den Equals-Override, um diese implementierte Methode aufzurufen. Die folgenden beiden Codeausschnitte zeigen z. B. einen Verstoß gegen die Regel und wie dieser korrigiert werden kann:

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

Wann sollten Warnungen unterdrückt werden?

Es ist in Ordnung, Verstöße gegen diese Regel zu unterdrücken, wenn die Entwurfs- und Leistungsvorteile der Implementierung der Schnittstelle nicht von entscheidender Bedeutung sind.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Siehe auch