CA2225: 연산자 오버로드에는 명명된 대체 항목이 있습니다.
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#에서는 이항 연산자가 오버로드되면 해당 할당 연산자도 암시적으로 오버로드됩니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 연산자에 대한 대체 메서드를 구현하고 권장되는 대체 이름을 사용하여 이름을 지정합니다.
경고를 표시하지 않는 경우
공유 라이브러리를 구현할 경우에는 이 규칙에서 경고를 표시해야 합니다. 응용 프로그램에서 이 규칙의 경고를 무시할 수 있습니다.
예제
다음 예제에서는 이 규칙을 위반하는 구조체를 정의합니다. 예제를 해결하려면 구조에 공용 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: 참조 형식에 같음 연산자를 오버로드하지 마십시오.
CA2226: 연산자에는 대칭 오버로드가 있어야 합니다.
CA2224: 같음 연산자를 오버로드할 때 Equals를 재정의하십시오.