Share via


CA2225: Operatoröverlagringar har namngett alternativ

Property Värde
Regel-ID CA2225
Title Operatoröverlagringar har namngivna alternativ
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

En överlagring av operatorn upptäcktes och den förväntade namngivna alternativa metoden hittades inte.

Som standard tittar den här regeln bara på externt synliga typer, men det kan konfigureras.

Regelbeskrivning

Med operatoröverlagring kan du använda symboler för att representera beräkningar för en typ. Till exempel skulle en typ som överbelastar plussymbolen + för tillägg vanligtvis ha en alternativ medlem med namnet Add. Den namngivna alternativa medlemmen ger åtkomst till samma funktioner som operatorn. Det tillhandahålls för utvecklare som programmerar på språk som inte stöder överbelastade operatorer.

Den här regeln undersöker:

  • Implicita och explicita cast-operatorer i en typ genom att söka efter metoder med namnet To<typename> och From<typename>.

  • Operatorerna som anges i följande tabell:

C# Visual Basic C++ Alternativt metodnamn
+ (binär) + + (binär) Lägga till
+= += += Lägga till
& och & BitwiseAnd
&= And= &= BitwiseAnd
| Eller | BitwiseOr
|= Eller= |= BitwiseOr
-- Ej tillämpligt -- Minskning
/ / / Dividera
/= /= /= Dividera
== = == Är lika med
^ Xor ^ Xor
^= Xor= ^= Xor
> > > CompareTo eller Compare
>= >= >= CompareTo eller Compare
++ Ej tillämpligt ++ Stegvis
!= <> != Är lika med
<< << << LeftShift
<<= <<= <<= LeftShift
< < < CompareTo eller Compare
<= <= <= CompareTo eller Compare
&& Ej tillämpligt && LogicalAnd
|| Ej tillämpligt || LogicalOr
! Ej tillämpligt ! LogicalNot
% Mod % Mod eller rest
%= Ej tillämpligt %= Mod
* (binär) * * Multiplicera
*= Ej tillämpligt *= Multiplicera
~ Not ~ OnesComplement
>> >> >> RightShift
>>= Ej tillämpligt >>= RightShift
- (binär) - (binär) - (binär) Subtract
-= Ej tillämpligt -= Subtract
true IsTrue Ej tillämpligt IsTrue (egenskap)
- (unary) Ej tillämpligt - Negera
+ (unary) Ej tillämpligt + Plustecken
falskt IsFalse Falsk IsTrue (egenskap)

*N/A innebär att operatorn inte kan överbelastas på det valda språket.

Kommentar

I C#, när en binär operator är överbelastad, överbelastas även motsvarande tilldelningsoperator, om någon, implicit.

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

Om du vill åtgärda ett brott mot den här regeln implementerar du den alternativa metoden för operatorn. Namnge den med det rekommenderade alternativa namnet.

När du ska ignorera varningar

Ignorera inte en varning från den här regeln om du implementerar ett delat bibliotek. Program kan ignorera en varning från den här regeln.

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

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

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

Konfigurera kod för analys

Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.

Du kan konfigurera det här alternativet för bara den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (användning) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.

Inkludera specifika API-ytor

Du kan konfigurera vilka delar av kodbasen som ska köras med den här regeln baserat på deras tillgänglighet. Om du till exempel vill ange att regeln endast ska köras mot den icke-offentliga API-ytan lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Exempel

I följande exempel definieras en struktur som bryter mot den här regeln. Du korrigerar exemplet genom att lägga till en offentlig Add(int x, int y) metod i strukturen.

public struct Point
{
    private int x, y;

    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

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

    // Violates rule: OperatorOverloadsHaveNamedAlternates.
    public static Point operator +(Point a, Point b)
    {
        return new Point(a.x + b.x, a.y + b.y);
    }

    public int X { get { return x; } }
    public int Y { get { return x; } }
}