Dela via


CA1066: Implementera IEquatable vid åsidosättande av lika med

Property Värde
Regel-ID CA1066
Title Implementera IEquatable vid åsidosättande av lika med
Kategori Designa
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 9 Nej

Orsak

En värdetyp (struct) åsidosätter metoden, men implementerar Equals IEquatable<T>inte .

Regelbeskrivning

En värdetyp som Equals åsidosätter metoden anger att den stöder jämförelse av två instanser av typen för värdejämlikhet. Överväg att implementera IEquatable<T> gränssnittet för att stödja starkt skrivna tester för likhet. Detta säkerställer att anropare som utför likhetskontroller anropar den starkt skrivna System.IEquatable<T>.Equals metoden och undviker att boxa argumentet, vilket förbättrar prestandan. Mer information finns här.

Implementeringen System.IEquatable<T>.Equals bör returnera resultat som är konsekventa med Equals.

Så här åtgärdar du överträdelser

Åtgärda en överträdelse genom att implementera IEquatable<T> och uppdatera Equals åsidosättning för att anropa den här implementerade metoden. Följande två kodfragment visar till exempel ett brott mot regeln och hur du åtgärdar den:

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

När du ska ignorera varningar

Det är säkert att förhindra överträdelser från den här regeln om design- och prestandafördelarna med att implementera gränssnittet inte är kritiska.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Se även