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


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

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

Причина

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

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

Это правило обозначает места в вашем коде, где вы:

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

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

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

Пример 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

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