运算符重载具有命名的备用项

更新:2007 年 11 月

TypeName

OperatorOverloadsHaveNamedAlternates

CheckId

CA2225

类别

Microsoft.Usage

是否重大更改

原因

检测到运算符重载,但未找到预期的指定备用方法。

规则说明

运算符重载允许使用符号来表示类型的计算。例如,重载用于加号 (+) 来进行相加的类型通常具有名为“Add”的备用成员。命名的备用成员提供了对与运算符相同的功能的访问,它提供给开发人员,在用不支持重载运算符的语言进行编程时使用。

该规则检查下表中列出的运算符。

C#

Visual Basic

C++

备用名称

+(二进制)

+

+(二进制)

Add

+=

+=

+=

Add

&

And

&

BitwiseAnd

&=

And=

&=

BitwiseAnd

|

Or

|

BitwiseOr

|=

Or=

|=

BitwiseOr

--

N/A

--

Decrement

/

/

/

Divide

/=

/=

/=

Divide

==

=

==

Equals

^

Xor

^

Xor

^=

Xor=

^=

Xor

>

>

>

Compare

>=

>=

>=

Compare

++

N/A

++

Increment

!=

<>

!=

Equals

<<

<<

<<

LeftShift

<<=

<<=

<<=

LeftShift

<

<

<

Compare

<=

<=

<=

Compare

&&

N/A

&&

LogicalAnd

||

N/A

||

LogicalOr

!

N/A

!

LogicalNot

%

Mod

%

Mod 或 Remainder

%=

N/A

%=

Mod

*(二进制)

*

*

Multiply

*=

N/A

*=

Multiply

~

Not

~

OnesComplement

>>

>>

>>

RightShift

>>=

N/A

>>=

RightShift

-(二进制)

-(二进制)

-(二进制)

Subtract

-=

N/A

-=

Subtract

true

IsTrue

N/A

IsTrue (Property)

-(一元)

N/A

-

Negate

+(一元)

N/A

+

Plus

false

IsFalse

False

IsTrue (Property)

N/A == 不能在选定语言中重载。

该规则还通过检查名为 ToSomeType 和 FromSomeType 的方法来检查类型 (SomeType) 中的隐式和显式转换运算符。

在 C# 中,重载一个二元运算符时,也会隐式重载相应的赋值运算符(若有)。

如何修复冲突

要修复与该规则的冲突,请实现运算符的备用方法;使用建议的备用名称来命名备用方法。

何时禁止显示警告

如果实现的是共享库,则不要禁止显示此规则发出的警告。应用程序可以忽略与该规则有关的警告。

示例

下面的示例定义一个与该规则冲突的结构。

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 时应重载相等运算符