Delen via


CA1066: IEquatable implementeren bij het overschrijven van equals

Eigenschappen Weergegeven als
Regel-id CA1066
Titel IEquatable implementeren bij het overschrijven van equals
Categorie Ontwerpen
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Nee

Oorzaak

Een waardetype (struct) overschrijft Equals methode, maar implementeert niet IEquatable<T>.

Beschrijving van regel

Een methode voor het overschrijven Equals van een waardetype geeft aan dat het ondersteuning biedt voor het vergelijken van twee exemplaren van het type voor gelijkheid van waarden. Overweeg de IEquatable<T> interface te implementeren ter ondersteuning van sterk getypte tests voor gelijkheid. Dit zorgt ervoor dat bellers die gelijkheidscontroles uitvoeren de sterk getypte System.IEquatable<T>.Equals methode aanroepen en voorkomen dat het argument wordt boksen, waardoor de prestaties worden verbeterd. Zie voor meer informatie hier.

Uw System.IEquatable<T>.Equals implementatie moet resultaten retourneren die consistent zijn met Equals.

Schendingen oplossen

Als u een schending wilt oplossen, implementeert en bijwerkt IEquatable<T>Equals u de onderdrukking om deze geïmplementeerde methode aan te roepen. In de volgende twee codefragmenten ziet u bijvoorbeeld een schending van de regel en hoe u deze kunt oplossen:

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

Wanneer waarschuwingen onderdrukken

Het is veilig om schendingen van deze regel te onderdrukken als het ontwerp en de prestaties van de implementatie van de interface niet essentieel zijn.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Zie ook