CA2225: Operator overloads have named alternates
|
TypeName |
OperatorOverloadsHaveNamedAlternates |
|
CheckId |
CA2225 |
|
Category |
Microsoft.Usage |
|
Breaking Change |
Non Breaking |
Operator overloading allows the use of symbols to represent computations for a type. For example, a type that overloads the plus symbol (+) for addition would typically have an alternative member named 'Add'. The named alternative member provides access to the same functionality as the operator, and is provided for developers who program in languages that do not support overloaded operators.
This rule examines the operators listed in the following table.
|
C# |
Visual Basic |
C++ |
Alternate name |
|---|---|---|---|
|
+ (binary) |
+ |
+ (binary) |
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 or Remainder |
|
%= |
N/A |
%= |
Mod |
|
* (binary) |
* |
* |
Multiply |
|
*= |
N/A |
*= |
Multiply |
|
~ |
Not |
~ |
OnesComplement |
|
>> |
>> |
>> |
RightShift |
|
>>= |
N/A |
>>= |
RightShift |
|
- (binary) |
- (binary) |
- (binary) |
Subtract |
|
-= |
N/A |
-= |
Subtract |
|
true |
IsTrue |
N/A |
IsTrue (Property) |
|
- (unary) |
N/A |
- |
Negate |
|
+ (unary) |
N/A |
+ |
Plus |
|
false |
IsFalse |
False |
IsTrue (Property) |
N/A == Cannot be overloaded in the selected language.
The rule also checks implicit and explicit cast operators in a type (SomeType) by checking for methods named ToSomeType and FromSomeType.
In C#, when a binary operator is overloaded, the corresponding assignment operator, if any, is also implicitly overloaded.
The following example defines a structure that violates this rule. To correct the example, add a public Add(int x, int y) method to the structure.
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;}} } }