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


CA1857: параметр ожидает константы для оптимальной производительности

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

Причина

Недопустимый аргумент передается параметру, который заметен с ConstantExpectedAttributeпомощью .

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

Это правило помечает код, где вы:

  • Реализуйте унаследованный метод, который использует ConstantExpectedAttribute атрибут, но не помечайте параметр с ConstantExpectedAttributeпомощью .
  • Передайте неконстантный аргумент параметру с атрибутом ConstantExpectedAttribute .
  • Передайте недопустимый аргумент константы параметру с атрибутом ConstantExpectedAttribute .
  • Передайте константный аргумент параметру, который имеет ConstantExpectedAttribute атрибут, и аргумент выходит за пределы диапазона или Max значенийMin.

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

Исправьте код, как указано в сообщении об ошибке, которое вы получаете.

Пример 1 (ожидаемый атрибут)

В следующем фрагменте кода показано нарушение CA1857:

public interface I1<T>
{
    T M1(T operand1, [ConstantExpected] T operand2);
}

public class C1 : I1<int>
{
    public int M1(int operand1, int operand2) =>
        throw new NotImplementedException();
}

Следующий фрагмент кода исправляет нарушение.

public interface I1<T>
{
    T M1(T operand1, [ConstantExpected] T operand2);
}

public class C1 : I1<int>
{
    public int M1(int operand1, [ConstantExpected] int operand2) =>
        throw new NotImplementedException();
}

Пример 2 (константная не константная)

В следующем фрагменте кода показано нарушение CA1857:

static void M1(int i) => M2(i);
static void M2([ConstantExpected] int i) { }

Следующий фрагмент кода исправляет нарушение.

static void M1([ConstantExpected] int i) => M2(i);
static void M2([ConstantExpected] int i) { }

Пример 3 (недопустимая константа)

В следующем фрагменте кода показано нарушение CA1857:

static void M1() => M2((string)(object)20);
static void M2([ConstantExpected] string s) { }

Следующий фрагмент кода исправляет нарушение.

static void M1() => M2("20");
static void M2([ConstantExpected] string s) { }

Пример 4 (константа вне границ)

В следующем фрагменте кода показано нарушение CA1857:

static void M1() => M2(5);
static void M2([ConstantExpected(Min = 3, Max = 4)] int i) { }

Следующий фрагмент кода исправляет нарушение.

static void M1() => M2(4);
static void M2([ConstantExpected(Min = 3, Max = 4)] int i) { }

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

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

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

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

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

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

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

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