CA2225: 演算子オーバーロードには名前付けされた代替が存在します
TypeName |
OperatorOverloadsHaveNamedAlternates |
CheckId |
CA2225 |
[カテゴリ] |
Microsoft.Usage |
互換性に影響する変更点 |
なし |
原因
演算子のオーバーロードが検出され、予想される名前の代替メソッドが検出されませんでした。
規則の説明
演算子のオーバーロードでは、型の計算を表すときに記号を使用できます。たとえば、追加を表す加算記号 (+) をオーバーロードする型には、"Add" という代替メンバーが含まれます。名前付きの代替メンバーによって、演算子と同じ機能へアクセスできるようになります。また、演算子のオーバーロードをサポートしていない言語でプログラミングする場合でも、その代替メンバーを使用できます。
この規則では、次の表に示す演算子がチェックされます。
C# |
Visual Basic |
C++ |
代替名 |
---|---|---|---|
+ (二項) |
+ |
+ (二項) |
追加 |
+= |
+= |
+= |
追加 |
& |
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 (プロパティ) |
- (単項) |
N/A |
- |
Negate |
+ (単項) |
N/A |
+ |
Plus |
false |
IsFalse |
False |
IsTrue (プロパティ) |
なし == 選択した言語ではオーバーロードできません。
また、ToSomeType および FromSomeType という名前のメソッドをチェックすることで、型 (SomeType) の暗黙的および明示的なキャスト演算子もチェックされます。
C# では、二項演算子をオーバーロードすると、対応する代入演算子がある場合には、この演算子も暗黙でオーバーロードされます。
違反の修正方法
この規則違反を修正するには、演算子の代替メソッドを実装し、推奨される代替名を付けます。
警告を抑制する状況
共有ライブラリを実装している場合は、この規則による警告を抑制しないでください。アプリケーションではこの規則の警告を無視できます。
使用例
この規則に違反する構造体の定義を次の例に示します。この例を修正するには、パブリックの Add(int x, int y) メソッドを構造体に追加します。
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;}}
}
}
関連規則
CA1046: 参照型で、演算子 equals をオーバーロードしないでください
CA2226: 演算子は対称型オーバーロードを含まなければなりません
CA2224: オーバーロードする演算子 equals で Equals をオーバーライドします