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


Ошибки и предупреждения, связанные с модификатором params для параметров метода

Существует несколько ошибок , связанных с инструкцией lock и синхронизацией потоков:

  • CS0225: параметр params должен быть одномерным массивом или иметь допустимый тип коллекции
  • CS0231: параметр params должен быть последним параметром в формальном списке параметров.
  • CS0466: method1 не должен иметь параметр params, так как метод2 не имеет
  • CS0674: не используйте System.ParamArrayAttribute илиSystem.ParamArrayAttribute/System.Runtime.CompilerServices.ParamCollectionAttribute. params Вместо этого используйте ключевое слово.
  • CS0758: оба объявления частичных методов должны использовать params параметр или не может использовать params параметр.
  • CS1104: массив параметров нельзя использовать с this модификатором в методе расширения.
  • CS1611: параметр params не может быть объявлен как в ref или out
  • CS1670: params недопустимо в этом контексте
  • CS1751: не удается указать значение по умолчанию для массива параметров.
  • CS9218: аргументы типа для метода не могут быть выведены из использования, так как используется аргумент с динамическим типом, а метод имеет параметр коллекции params, отличный от массива. Попробуйте явно указать аргументы типа.
  • CS9219: неоднозначность между расширенными и нормальными формами параметра коллекции парамс, не относящихся к массиву, единственный соответствующий аргумент имеет тип dynamic. Рассмотрите возможность приведения динамического аргумента.
  • CS9223: создание коллекции params приводит к бесконечной цепочке вызова конструктора.
  • CS9224: метод не может быть менее видимым, чем член с коллекцией params.
  • CS9225: конструктор оставляет обязательный элемент неинициализированным.
  • CS9227: тип не содержит определения для подходящего метода экземпляра Add .
  • CS9228: тип коллекции params, отличный от массива, должен иметь применимый конструктор, который можно вызывать без аргументов.

Кроме того, компилятор может создать следующее предупреждение , связанное с модификатором params параметров метода:

  • CS9220: одна или несколько перегрузок метода с параметром коллекции params без массива могут применяться только в развернутой форме, которая не поддерживается во время динамической отправки.
  • CS9221: одна или несколько перегрузок индексатора с параметром коллекции params без массива могут применяться только в развернутой форме, которая не поддерживается во время динамической отправки.
  • CS9222: одна или несколько перегрузк конструкторов с параметром коллекции params без массива могут применяться только в развернутой форме, которая не поддерживается во время динамической отправки.

Правила объявления метода

Следующие ошибки указывают на использование params модификатора в параметре, если params модификатор не разрешен в этом контексте:

  • CS0231: параметр params должен быть последним параметром в формальном списке параметров.
  • CS1104: массив параметров нельзя использовать с this модификатором в методе расширения.
  • CS1611: параметр params не может быть объявлен как в ref или out
  • CS1670: params недопустимо в этом контексте
  • CS1751: не удается указать значение по умолчанию для массива параметров.

Компилятор применяет следующие правила для использования params модификатора в параметре метода:

  • params Модификатор разрешен только в последнем параметре в формальном списке параметров. Сюда входят все параметры со значением по умолчанию.
  • Не удается включить аргумент по умолчанию для параметра при params использовании модификатора.
  • params Модификатор не может применяться к ссылочным параметру. Ссылочный параметр является одним из них с модификатором или модификатором inrefref readonly.out
  • params Модификатор не может сочетаться с this модификатором метода расширения.
  • params Модификатор нельзя использовать в перегруженном операторе.

В версиях до C# 12 params модификатор нельзя использовать для параметра анонимного метода или лямбда-выражения.

Правила типа параметров и аргументов

Следующие ошибки указывают, что тип используемого params параметра недопустим:

  • CS9218: аргументы типа для метода не могут быть выведены из использования, так как используется аргумент с динамическим типом, а метод имеет параметр коллекции params, отличный от массива. Попробуйте явно указать аргументы типа.
  • CS9219: неоднозначность между расширенными и нормальными формами параметра коллекции парамс, не относящихся к массиву, единственный соответствующий аргумент имеет тип dynamic. Рассмотрите возможность приведения динамического аргумента.
  • CS0225: параметр params должен быть одномерным массивом или иметь допустимый тип коллекции
  • CS9227: тип не содержит определения для подходящего метода экземпляра Add .
  • CS9228: тип коллекции params, отличный от массива, должен иметь применимый конструктор, который можно вызывать без аргументов.

Следующие предупреждения указывают на то, что одна из возможных перегрузк может включать динамическую отправку. Динамический характер аргумента не участвует в разрешении перегрузки.

  • CS9220: одна или несколько перегрузок метода с параметром коллекции params без массива могут применяться только в развернутой форме, которая не поддерживается во время динамической отправки.
  • CS9221: одна или несколько перегрузок индексатора с параметром коллекции params без массива могут применяться только в развернутой форме, которая не поддерживается во время динамической отправки.
  • CS9222: одна или несколько перегрузк конструкторов с параметром коллекции params без массива могут применяться только в развернутой форме, которая не поддерживается во время динамической отправки.

В версиях до C# 13 params модификатор разрешен только в одномерных массивах. Другие типы не были допустимыми.

Начиная с C# 13 можно использовать любой допустимый тип коллекции. Однако некоторые ограничения остаются. Тип коллекции должен соответствовать тем же правилам, что и целевой объект выражения коллекции.

Другие ошибки парамс

Следующие ошибки указывают на другие проблемы с использованием params модификатора:

  • CS0466: method1 не должен иметь параметр params, так как метод2 не имеет
  • CS0674: не используйте System.ParamArrayAttribute илиSystem.Runtime.CompilerServices.ParamCollectionAttribute. params Вместо этого используйте ключевое слово.
  • CS0758: оба объявления частичных методов должны использовать params параметр или не может использовать params параметр.
  • CS9223: создание коллекции params приводит к бесконечной цепочке вызова конструктора.
  • CS9224: метод не может быть менее видимым, чем член с коллекцией params.
  • CS9225: конструктор оставляет обязательный элемент неинициализированным.

Метод, реализующий интерфейс, должен включать params модификатор, если и только если элемент интерфейса имеет params модификатор. Аналогичным образом оба объявления partial метода должны включать params модификатор, или ни один из них не может включать params модификатор.

Необходимо использовать модификатор params . Вы не можете применить эквивалентные атрибуты либо System.ParamArrayAttributeSystem.Runtime.CompilerServices.ParamCollectionAttribute.

Компилятор создает одну из последних трех ошибок в предыдущем списке, когда код, созданный для создания типа коллекции, недопустим:

  • Компилятор выдает CS9223 , когда код, создаваемый для создания коллекции, также содержит коллекцию парам одного типа. Как правило, Add метод принимает params коллекцию одного типа.
  • Компилятор выдает CS9224 , когда Create метод для типа коллекции менее доступен, чем метод, params принимаюющий параметр типа коллекции.
  • Компилятор выдает CS9225 , когда тип коллекции имеет обязательный элемент, и конструктор без параметров не инициализирует этот элемент и имеет System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute конструктор без параметров.

См. также