Operator overloads have named alternates
TypeName |
OperatorOverloadsHaveNamedAlternates |
CheckId |
CA2225 |
Category |
Microsoft.Usage |
Breaking Change |
NonBreaking |
Cause
An operator overload was detected, and the expected named alternative method was not found.
Rule Description
Operator overloading permits 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 programming in languages that do not support overloaded operators, such as Visual Basic .NET.
This rule examines the operators listed in the following table.
C# symbol | Alternate name |
---|---|
+, += |
Add |
-, -= |
Subtract |
*, *= |
Multiply |
/, /= |
Divide |
%, %= |
Mod |
>, >=, <, <=, != |
Compare |
== |
Equals |
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.
How to Fix Violations
To fix a violation of this rule, implement the alternative method for the operator; name it using the recommended alternative name.
When to Exclude Warnings
Do not exclude a warning from this rule if you are implementing a shared library. Applications can ignore a warning from this rule.
Example
The following example defines a structure that violates this rule.
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;}}
}
}
Related Rules
Do not overload operator equals on reference types
Operators should have symmetrical overloads
Override equals on overloading operator equals