共用方式為


運算子多載必須有具名的替代方法

更新:2007 年 11 月

型別名稱

OperatorOverloadsHaveNamedAlternates

CheckId

CA2225

分類

Microsoft.Usage

中斷變更

非中斷

原因

偵測到運算子多載,且找不到預期的具名替代方法。

規則描述

運算子多載容許使用符號來表示型別的計算。例如,針對加法而多載加號 (+) 的型別通常會有名稱為 'Add' 的替代成員。具名的替代成員會提供與運算子相同的功能存取,並且可供以不支援多載運算子 (Overload Operator) 的語言設計程式的開發人員使用。

此規則會檢查下表所列的運算子。

C#

Visual Basic

C++

替代名稱

+ (二元)

+

+ (二元)

Add

+=

+=

+=

Add

&

And

&

BitwiseAnd

&=

And=

&=

BitwiseAnd

|

Or

|

BitwiseOr

|=

Or=

|=

BitwiseOr

--

N/A

--

遞減

/

/

/

Divide

/=

/=

/=

Divide

==

=

==

Equals

^

Xor

^

Xor

^=

Xor=

^=

Xor

>

>

>

比較

>=

>=

>=

比較

++

N/A

++

遞增

!=

<>

!=

Equals

<<

<<

<<

LeftShift

<<=

<<=

<<=

LeftShift

<

<

<

比較

<=

<=

<=

比較

&&

N/A

&&

LogicalAnd

||

N/A

||

LogicalOr

!

N/A

!

LogicalNot

%

Mod

%

Mod 或餘數

%=

N/A

%=

Mod

* (二元)

*

*

Multiply

*=

N/A

*=

Multiply

~

Not

~

OnesComplement

>>

>>

>>

RightShift

>>=

N/A

>>=

RightShift

- (二元)

- (二元)

- (二元)

Subtract

-=

N/A

-=

Subtract

true

IsTrue

N/A

IsTrue (屬性)

- (二元)

N/A

-

Negate

+ (二元)

N/A

+

Plus

false

IsFalse

False

IsTrue (屬性)

N/A == 在選取的語言中不能多載。

此規則也會檢查名為 ToSomeType 和 FromSomeType 的方法,以檢查型別 (SomeType) 中的隱含和明確轉型運算子。

在 C# 中,當二元 (Binary) 運算子為多載時,同時隱含對應的指派運算子 (若有的話) 為多載。

如何修正違規

若要修正此規則的違規情形,請實作運算子的替代方法,即使用建議的替代名稱加以命名。

隱藏警告的時機

如果您正在實作共用程式庫,請勿隱藏此規則的警告。應用程式可忽略此規則的警告。

範例

下列範例會定義違反此規則的結構。

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

相關規則

請勿多載參考型別上的等號比較運算子

運算子應該有對稱的多載

多載等號比較運算子時必須一併覆寫 Equals

覆寫 Equals 時必須一併覆寫 GetHashCode

覆寫 ValueType.Equals 時必須一併多載等號比較運算子