Condividi tramite


Gli overload degli operatori hanno alternative con nome

Aggiornamento: novembre 2007

TypeName

OperatorOverloadsHaveNamedAlternates

CheckId

CA2225

Category

Microsoft.Usage

Breaking Change

Non sostanziale

Causa

È stato rilevato un overload di operatore e il metodo alternativo denominato previsto non è stato trovato.

Descrizione della regola

L'overload dell'operatore consente di utilizzare simboli per rappresentare calcoli per un tipo. Ad esempio, un tipo che esegue l'overload del segno più (+) per l'addizione presenta in genere un membro alternativo denominato "Add". Il membro alternativo denominato fornisce accesso alla stessa funzionalità dell'operatore e viene fornito per gli sviluppatori che programmano in linguaggi che non supportano operatori di overload.

Questa regola esamina gli operatori elencati nella tabella riportata di seguito.

C#

Visual Basic

C++

Nome alternativo

+ (binario)

+

+ (binario)

Add

+=

+=

+=

Add

&

And

&

BitwiseAnd

&=

And=

&=

BitwiseAnd

|

Or

|

BitwiseOr

|=

Or=

|=

BitwiseOr

--

N/D

--

Decrement

/

/

/

Divide

/=

/=

/=

Divide

==

=

==

Equals

^

Xor

^

Xor

^=

Xor=

^=

Xor

>

>

>

Compare

>=

>=

>=

Compare

++

N/D

++

Increment

!=

<>

!=

Equals

<<

<<

<<

LeftShift

<<=

<<=

<<=

LeftShift

<

<

<

Compare

<=

<=

<=

Compare

&&

N/D

&&

LogicalAnd

||

N/D

||

LogicalOr

!

N/D

!

LogicalNot

%

Mod

%

Mod o resto

%=

N/D

%=

Mod

* (binario)

*

*

Multiply

*=

N/D

*=

Multiply

~

Not

~

OnesComplement

>>

>>

>>

RightShift

>>=

N/D

>>=

RightShift

- (binario)

- (binario)

- (binario)

Subtract

-=

N/D

-=

Subtract

true

IsTrue

N/D

IsTrue (Proprietà)

- (unario)

N/D

-

Negate

+ (unario)

N/D

+

Plus

false

IsFalse

False

IsTrue (Proprietà)

N/D == Non può essere sottoposto a overload nel linguaggio selezionato.

La regola controlla inoltre gli operatori di cast impliciti ed espliciti in un tipo (SomeType) cercando i metodi denominati ToSomeType e FromSomeType.

In C#, quando si esegue l'overload di un operatore binario, viene eseguito in modo implicito anche l'overload dell'eventuale operatore di assegnazione corrispondente.

Correzione di violazioni

Per correggere una violazione di questa regola, implementare il metodo alternativo per l'operatore; denominarlo utilizzando il nome alternativo consigliato.

Esclusione di avvisi

Non escludere un avviso da questa regola se si implementa una libreria condivisa. Le applicazioni possono ignorare un avviso da questa regola.

Esempio

Nell'esempio riportato di seguito viene definita una struttura che viola questa regola.

using System;

namespace UsageLibrary
{
    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;}}
    }
}

Regole correlate

Non eseguire l'overload dell'operatore "uguale a" per i tipi di riferimento

Gli operatori devono avere overload simmetrici

Eseguire l'override di Equals all'overload dell'operatore "uguale a"

Eseguire l'override di GetHashCode all'override di Equals

Eseguire l'overload dell'operatore "uguale a" all'override di ValueType.Equals