Поделиться через


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