CA2225: для перезагрузок оператора существуют дополнения с именами

Свойство Значение
Идентификатор правила CA2225
Заголовок Для перегрузок операторов существуют варианты с именами
Категория Использование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

Обнаружена перегрузка оператора, однако не найден ожидаемый именованный альтернативный метод.

По умолчанию это правило проверяет только видимые извне типы, но это поведение можно настроить.

Описание правила

Перегрузка операторов позволяет использовать символы для представления вычислений для типа. Например, тип, который перегружает символ "плюс" + для сложения, обычно имеет альтернативный элемент с именем Add. Именованный альтернативный элемент предоставляет доступ к тем же функциональным возможностям, что и оператор. Он предоставляется разработчикам, которые пишут код на языках, не поддерживающих перегруженные операторы.

Это правило проверяет следующие компоненты.

  • Операторы неявного и явного приведений в типе путем проверки на наличие методов с именами To<typename> и From<typename>.

  • Операторы перечислены в следующей таблице.

C# Visual Basic C++ Имя альтернативного метода
+ (бинарный) + + (бинарный) Добавление
+= += += Добавление
& And & BitwiseAnd
&= And= &= BitwiseAnd
| Or | BitwiseOr
|= Or= |= BitwiseOr
-- Н/П -- Decrement
/ / / Разделить
/= /= /= Разделить
== = == Равно
^ Xor ^ Xor
^= Xor= ^= Xor
> > > CompareTo или Compare
>= >= >= CompareTo или Compare
++ Н/П ++ Шаг
!= <> != Равно
<< << << LeftShift
<<= <<= <<= LeftShift
< < < CompareTo или Compare
<= <= <= CompareTo или Compare
&& Н/П && LogicalAnd
|| Н/П || LogicalOr
! Н/П ! LogicalNot
% Mod % Mod или Remainder
%= Н/П %= Mod
* (двоичный) * * Умножение
*= Н/П *= Умножение
~ Not ~ OnesComplement
>> >> >> RightShift
>>= Н/П >>= RightShift
- (бинарный) - (бинарный) - (бинарный) Вычитание
-= Н/П -= Вычитание
true IsTrue Н/П IsTrue (свойство)
— (унарные) Н/П - Negate
+ (унарный) Н/П + Плюс
false IsFalse False IsTrue (свойство)

*N/A означает, что оператор не может быть перегружен на выбранном языке.

Примечание.

В C# при перегрузке бинарного оператора соответствующий оператор присвоения (если таковой имеется) также неявно перегружается.

Устранение нарушений

Чтобы устранить нарушение этого правила, реализуйте альтернативный метод для оператора. Присвойте ему рекомендуемое альтернативное имя.

Когда лучше отключить предупреждения

Не отключайте вывод предупреждения для этого правила, если вы реализуете общую библиотеку. Приложения могут игнорировать предупреждение для этого правила.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA2225
// The code that's violating the rule is on this line.
#pragma warning restore CA2225

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA2225.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Настройка кода для анализа

Используйте следующий параметр, чтобы выбрать части базы кода для применения этого правила.

Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (использование), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.

Включение определенных контактных зон API

Вы можете настроить, для каких частей базы кода следует выполнять это правило в зависимости от их доступности. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Пример

В следующем примере определяется структура, нарушающая это правило. Чтобы исправить пример, добавьте в структуру общедоступный метод Add(int x, int y).

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; } }
}