Share via


CA1046: Operator voor overbelasting is niet gelijk aan verwijzingstypen

Eigenschappen Weergegeven als
Regel-id CA1046
Titel Operator voor overbelasting is niet gelijk aan verwijzingstypen
Categorie Ontwerpen
Oplossing is brekend of niet-brekend Breken
Standaard ingeschakeld in .NET 9 Nee

Oorzaak

Een openbaar of genest openbaar referentietype overbelast de gelijkheidsoperator.

Beschrijving van regel

Voor referentietypen is de standaard implementatie van de gelijkheidsoperator bijna altijd juist. Standaard zijn twee verwijzingen alleen gelijk als ze verwijzen naar hetzelfde object.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, verwijdert u de implementatie van de gelijkheidsoperator.

Wanneer waarschuwingen onderdrukken

Het is veilig om een waarschuwing van deze regel te onderdrukken wanneer het verwijzingstype zich gedraagt als een ingebouwd waardetype. Als het zinvol is om optellen of aftrekken uit te voeren op exemplaren van het type, is het waarschijnlijk juist om de gelijkheidsoperator te implementeren en de schending te onderdrukken.

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 CA1046
// The code that's violating the rule is on this line.
#pragma warning restore CA1046

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.CA1046.severity = none

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Code configureren om te analyseren

Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.

U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (ontwerp) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.

Specifieke API-oppervlakken opnemen

U kunt instellen op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid. Als u bijvoorbeeld wilt opgeven dat de regel alleen moet worden uitgevoerd op het niet-openbare API-oppervlak, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Voorbeeld 1

In het volgende voorbeeld ziet u het standaardgedrag bij het vergelijken van twee verwijzingen.

public class MyReferenceType
{
    private int a, b;
    public MyReferenceType(int a, int b)
    {
        this.a = a;
        this.b = b;
    }

    public override string ToString()
    {
        return String.Format("({0},{1})", a, b);
    }
}

Voorbeeld 2

In de volgende toepassing worden enkele verwijzingen vergeleken.

public class ReferenceTypeEquality
{
    public static void Main1046()
    {
        MyReferenceType a = new MyReferenceType(2, 2);
        MyReferenceType b = new MyReferenceType(2, 2);
        MyReferenceType c = a;

        Console.WriteLine("a = new {0} and b = new {1} are equal? {2}", a, b, a.Equals(b) ? "Yes" : "No");
        Console.WriteLine("c and a are equal? {0}", c.Equals(a) ? "Yes" : "No");
        Console.WriteLine("b and a are == ? {0}", b == a ? "Yes" : "No");
        Console.WriteLine("c and a are == ? {0}", c == a ? "Yes" : "No");
    }
}

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

a = new (2,2) and b = new (2,2) are equal? No
c and a are equal? Yes
b and a are == ? No
c and a are == ? Yes

Zie ook