CA2225: для перезагрузок оператора существуют дополнения с именами
TypeName |
OperatorOverloadsHaveNamedAlternates |
CheckId |
CA2225 |
Категория |
Microsoft.Usage |
Критическое изменение |
Не критическое |
Причина
Обнаружена перегрузка оператора, однако не найден ожидаемый именованный альтернативный метод.
Описание правила
Перегрузка операторов позволяет использовать символы, представляющие вычисления для типа.Например, тип, который перегружает символ "плюс" (+) для сложения, обычно имеет альтернативный член с именем "Add".Именованный альтернативный член предоставляет те же функции, что и основной оператор, и его могут использовать разработчики, которые программируют на языках, не поддерживающих перегрузку операторов.
Данное правило отслеживает операторы, перечисленные в следующей таблице.
C# |
Visual Basic |
C++ |
Альтернативное имя |
---|---|---|---|
+ (двоичное) |
+ |
+ (двоичное) |
Add |
+= |
+= |
+= |
Add |
& |
And |
& |
BitwiseAnd |
&= |
And= |
&= |
BitwiseAnd |
| |
Или |
| |
BitwiseOr |
|= |
Or= |
|= |
BitwiseOr |
-- |
Недоступно |
-- |
Decrement |
/ |
/ |
/ |
Divide |
/= |
/= |
/= |
Divide |
== |
= |
== |
Equals |
^ |
Xor |
^ |
Xor |
^= |
Xor= |
^= |
Xor |
> |
> |
> |
Сравнение |
>= |
>= |
>= |
Сравнение |
++ |
Недоступно |
++ |
Increment |
!= |
<> |
!= |
Equals |
<< |
<< |
<< |
LeftShift |
<<= |
<<= |
<<= |
LeftShift |
< |
< |
< |
Сравнение |
<= |
<= |
<= |
Сравнение |
&& |
Недоступно |
&& |
LogicalAnd |
|| |
Недоступно |
|| |
LogicalOr |
! |
Недоступно |
! |
LogicalNot |
% |
Mod |
% |
Mod или Remainder |
%= |
Недоступно |
%= |
Mod |
* (двоичное) |
* |
* |
Multiply |
*= |
Недоступно |
*= |
Multiply |
~ |
Not |
~ |
OnesComplement |
>> |
>> |
>> |
RightShift |
>>= |
Недоступно |
>>= |
RightShift |
- (двоичное) |
- (двоичное) |
- (двоичное) |
Subtract |
-= |
Недоступно |
-= |
Subtract |
true |
IsTrue |
Недоступно |
IsTrue (свойство) |
- (унарный) |
Недоступно |
- |
Negate |
+ (унарный) |
Недоступно |
+ |
Plus |
false |
IsFalse |
False |
IsTrue (свойство) |
Не определено == не может быть перегружен в выбранном языке.
Данное правило также проверяет неявные и явные операторы приведения в типе (SomeType) посредством проверки методов с именами ToSomeType и FromSomeType.
В 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: переопределяйте равенство при перегрузке оператора равенства
CA2218: переопределяйте GetHashCode при переопределении Equals
CA2231: перегружать равенство операторов следует при перегрузке ValueType.Equals