Бөлісу құралы:


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

Свойство Значение
Идентификатор правила CA2225
Заголовок Альтернативные имена существуют для перегрузок операторов
Категория Использование
Исправление является критическим или не критическим неразрывный
Включен по умолчанию в .NET 10 Нет
Применимые языки C# и Visual Basic

Причина

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

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

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

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

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

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

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

C# Visual Basic C++ Имя альтернативного метода
+ (бинарный) + + (бинарный) Добавление
+= += += Добавление
& И & BitwiseAnd
&= И= &= BitwiseAnd
| Или | BitwiseOr
|= Or= |= BitwiseOr
-- Н/П -- Декремент
/ / / Разделить
/= /= /= Разделить
== = == Равно
^ Xor ^ Xor
^= Xor= ^= XOR
> > > CompareTo или Compare
>= >= >= CompareTo или Compare
++ Н/П ++ Инкремент
!= <> != Равно
<< << << LeftShift
<<= <<= <<= СдвигВлево
< < < CompareTo или Compare
<= <= <= CompareTo или Compare
&& Н/П && LogicalAnd
|| Н/П || LogicalOr
! Н/П ! ЛогическоеНе
% модуль % Mod или Remainder
%= Н/П %= мод
* (двоичный) * * Умножить
*= Н/П *= Умножить
~ Нет ~ OnesComplement
>> >> >> RightShift
>>= Н/П >>= RightShift
- (бинарный) - (бинарный) - (бинарный) Вычесть
-= Н/П -= Вычесть
true IsTrue Н/П IsTrue (свойство)
- (унарный) Н/П - Negate
+ (унарный) Н/П + Плюс
false IsFalse Ложь 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_surface. Например, чтобы указать, что правило должно выполняться только для непубличной поверхности API, добавьте следующую пару "ключ-значение" в файл .editorconfig в ваш проект:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Примечание.

Замените XXXX частью CAXXXX идентификатором применимого правила.

Пример

В следующем примере определяется структура, нарушающая это правило. Чтобы исправить пример, добавьте в структуру общедоступный метод 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; } }
}