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


Устранение ошибок и предупреждений в объявлениях массива и коллекции и выражениях инициализации

В этой статье рассматриваются следующие ошибки компилятора:

  • CS0022: неправильное число индексов внутри [], ожидаемое "число"
  • CS0178: недопустимый описатель ранга: ожидаемый "," или "]"
  • CS0248: невозможно создать массив с отрицательным размером
  • CS0270: размер массива нельзя указать в объявлении переменной (попробуйте инициализировать с выражением 'new')
  • CS0611: элементы массива не могут быть типами
  • CS0623: инициализаторы массивов могут использоваться только в инициализаторе переменных или полей. Попробуйте использовать новое выражение.
  • CS0650: недопустимый декларатор массива. Чтобы объявить управляемый массив, описатель ранга предшествует идентификатору переменной. Чтобы объявить поле буфера фиксированного размера, используйте фиксированное ключевое слово перед типом поля.
  • CS0719: элементы массива не могут быть статическим типом
  • CS0747: недопустимый декларатор элемента инициализатора.
  • CS0820: не удается назначить инициализатор массива неявным типизированным локальным
  • CS0826: не найден лучший тип для неявно типизированного массива.
  • CS0846: ожидается инициализатор вложенного массива
  • CS1063: лучший перегруженный метод Add для элемента инициализатора коллекции устарел.
  • CS1552: описатель типа массива, []должен отображаться перед именем параметра
  • CS1586: создание массива должно иметь размер массива или инициализатор массива
  • CS1920: инициализатор элементов не может быть пустым.
  • CS1921: лучший перегруженный метод соответствует неправильной сигнатуре для элемента инициализатора. Инициализируемый Add должен быть доступным методом экземпляра.
  • CS1925: не удается инициализировать объект типа type с инициализатором коллекции.
  • CS1950: лучший перегруженный метод Add для инициализатора коллекции имеет некоторые недопустимые аргументы.
  • CS1954: нельзя использовать лучший перегруженный метод для элемента инициализатора коллекции. Методы инициализатора коллекции "Add" не могут иметь ref или out параметры.
  • CS9174: не удается инициализировать тип с помощью литерала коллекции, так как тип не является конструктором.
  • CS9176: для литерала коллекции нет целевого типа.
  • CS9185: тип построителя CollectionBuilderAttribute должен быть не универсальным классом или структурой.
  • CS9186: недопустимое имя метода CollectionBuilderAttribute.
  • CS9187: не удалось найти доступный метод с ожидаемой сигнатурой: статический метод с одним параметром типа ReadOnlySpan<T>; и правильный тип возвращаемого значения
  • CS9188: Тип имеет коллекцию CollectionBuilderAttribute, но не тип элемента.
  • CS9203: выражение коллекции этого типа нельзя использовать в этом контексте, так как оно может быть предоставлено вне текущей области.
  • CS9210: эта версия System.Collections.Immutable.ImmutableArray<T>не может использоваться с выражениями коллекции.
  • CS9212: оператор распространения '..' не может работать с переменными типа "type", так как "тип" не содержит общедоступного экземпляра или определения расширения для "member".
  • CS9213: целевой объект выражения коллекции "type" не имеет типа элемента.
  • CS9214: тип выражения коллекции должен иметь применимый конструктор, который можно вызывать без аргументов.
  • CS9215: тип выражения коллекции "type" должен иметь экземпляр или метод расширения "Add", который можно вызвать с одним аргументом.
  • CS9222: Инициализатор коллекции приводит к бесконечной цепочке создания экземпляров коллекции «type».
  • CS9332: Невозможно использовать оператор раскидывания '..' в выражении фильтра catch.
  • CS9354: элемент 'with(...)' должен быть первым элементом
  • CS9355: Конструкции 'with(...)' не поддерживаются для типа 'type'
  • CS9356: аргументы элемента 'with(...)' не могут быть динамическими
  • CS9357: элемент with(...)" для интерфейса только для чтения должен быть пустым, если присутствует
  • CS9358: тип элемента этой коллекции не может быть ссылочной структурой или параметром типа, допускающим ссылочные структуры
  • CS9359: Для метода 'method' нет перегрузки, принимающей 'number' аргументов типа 'with(...)'

Кроме того, в этой статье рассматриваются следующие предупреждения:

  • CS1062: самый лучший перегруженный метод Add для элемента инициализатора коллекции устарел.
  • CS1064: лучший перегруженный метод Add для элемента инициализатора коллекции устарел.
  • CS3007: перегруженный метод "method" отличается только по неименованным типам массивов не соответствует CLS.
  • CS3016: массивы в качестве аргументов атрибутов не соответствуют clS
  • CS0251: индексирование массива с отрицательным индексом (индексы массива всегда начинаются с нуля)
  • CS9208: выражение коллекции может привести к непредвиденным выделениям кучи. Рассмотрите возможность явного создания массива, а затем преобразования в окончательный тип, чтобы сделать выделение явным.
  • CS9209: выражение коллекции может привести к непредвиденным выделениям кучи из-за использования спредов "..". Рассмотрите возможность явного создания массива, а затем преобразования в окончательный тип, чтобы сделать выделение явным.
  • CS9332: Невозможно использовать оператор раскидывания '..' в выражении фильтра catch.

Недопустимый доступ к элементу массива

  • CS0022: неправильное число индексов внутри [], ожидаемое "число"
  • CS0251: индексирование массива с отрицательным индексом (индексы массива всегда начинаются с нуля)

Чтобы правильно получить доступ к элементам массива, следуйте этим правилам индексирования. Дополнительные сведения см. в статье Arrays (C++/CLI and C++/CX) (Массивы (C++/CLI и C++/CX)).

  • Укажите то же количество индексов, что и объявленные измерения (CS00222). Одномерный массив нуждается в одном индексе; Для трехмерного массива требуется три индекса.
  • Используйте только неотрицательных целых чисел для индексов массива (CS0251). Индексы массива всегда начинаются с нуля.

Недопустимый инициализатор коллекции

  • CS0747: недопустимый декларатор элемента инициализатора.
  • CS1920: инициализатор элементов не может быть пустым.
  • CS1921: лучший перегруженный метод соответствует неправильной сигнатуре для элемента инициализатора. Инициализируемый Add должен быть доступным методом экземпляра.
  • CS1922: не удается инициализировать тип type с инициализатором коллекции, так как тип не реализует system.Collections.IEnumerable.
  • CS1925: не удается инициализировать объект типа type с инициализатором коллекции.
  • CS1927: предупреждение: игнорировать /win32manifest для модуля, так как он применяется только к сборкам
  • CS1950: лучший перегруженный метод Add для инициализатора коллекции имеет некоторые недопустимые аргументы.
  • CS1954: нельзя использовать лучший перегруженный метод для элемента инициализатора коллекции. Методы инициализатора коллекции "Add" не могут иметь ref или out параметры.
  • CS9174: не удается инициализировать тип с помощью литерала коллекции, так как тип не является конструктором.
  • CS9176: для литерала коллекции нет целевого типа.
  • CS9203: выражение коллекции этого типа нельзя использовать в этом контексте, так как оно может быть предоставлено вне текущей области.
  • CS9210: эта версия System.Collections.Immutable.ImmutableArray<T> не может использоваться с выражениями коллекции.
  • CS9212: оператор распространения ".." не может работать с переменными типа "type", так как "type" не содержит общедоступного экземпляра или определения расширения для "member".
  • CS9213: целевой объект выражения коллекции "type" не имеет типа элемента.
  • CS9214: тип выражения коллекции должен иметь применимый конструктор, который можно вызывать без аргументов.
  • CS9215: тип выражения коллекции "type" должен иметь экземпляр или метод расширения "Add", который можно вызвать с одним аргументом.
  • CS9222: инициализатор коллекции приводит к бесконечной цепочке экземпляров коллекции type.
  • CS9332: не удается использовать оператор распространения '..' в выражении фильтра предложения catch.
  • CS9354: элемент "with(...)" должен быть первым элементом
  • CS9355: "with(...)" элементы не поддерживаются для типа "type"
  • CS9356: аргументы элементов with(...) не могут быть динамическими
  • CS9357: элемент 'with(...)' для интерфейса, доступного только для чтения, должен быть пустым, если он присутствует
  • CS9358: тип элемента этой коллекции не может быть ref struct или параметром типа, допускающим ref struct
  • CS9359: Для метода 'method' нет перегрузки, принимающей 'number' аргументов с элементом 'with(...)'

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

  • CS1062: самый лучший перегруженный метод Add для элемента инициализатора коллекции устарел.
  • CS1063: лучший перегруженный метод Add для элемента инициализатора коллекции устарел.
  • CS1064: лучший перегруженный метод Add для элемента инициализатора коллекции устарел.
  • CS9208: выражение коллекции может привести к непредвиденным выделениям кучи. Рассмотрите возможность явного создания массива, а затем преобразования в окончательный тип, чтобы сделать выделение явным.
  • CS9209: выражение коллекции может привести к непредвиденным выделениям кучи из-за использования спредов "..". Рассмотрите возможность явного создания массива, а затем преобразования в окончательный тип, чтобы сделать выделение явным.

Чтобы создать допустимые инициализаторы коллекции, следуйте этим правилам. Дополнительные сведения см. в разделе "Выражения коллекции".

  • Не смешивайте инициализацию свойств с добавлением элемента в том же инициализаторе (CS0747).
  • Добавьте как минимум один элемент в инициализаторы коллекции, использующие фигурные скобки (CS1920).
  • Убедитесь, что тип коллекции реализует IEnumerable (CS1922).
  • Инициализаторы коллекций используются только с типами коллекций (CS1925).
  • Add Убедитесь, что метод доступен, принимает один параметр, соответствующий типу элемента, и не использует ref или out модификаторы (CS1921, CS1954).
  • Разрешать неоднозначные Add перегрузки методов (CS1950).
  • Предоставьте явный целевой тип для выражений коллекции, если компилятор не может вывести его (CS9176, CS9213).
  • Убедитесь, что тип коллекции может быть создан с помощью конструктора без параметров (CS9174, CS9214).
  • Не используйте ref struct типы в выражениях коллекции, которые могут нарушать безопасность ссылок (CS9203).
  • Обновление до совместимой версии среды выполнения для ImmutableArray выражений коллекции (CS9210).
  • Реализуйте шаблоны перечисления (например GetEnumerator) для поддержки операторов распространения (CS9212).
  • Избегайте циклических зависимостей в инициализации коллекции (CS9222).
  • Не используйте оператор расширения в фильтрующих выражениях catch (CS9332).
  • Поместите элемент with(...) первым в выражениях коллекции (CS9354).
  • Используйте with(...) элементы только с типами, поддерживающими аргументы выражения коллекции (CS9355).
  • Не используйте динамические аргументы в with(...) элементах (CS9356).
  • Используйте пустые with() типы интерфейсов только для чтения (CS9357).
  • Не используйте типы структур ref в качестве типов элементов в коллекциях, которые не поддерживают их (CS9358).
  • Сопоставляйте число with(...) аргументов с доступными перегрузками конструктора (CS9359).

Недопустимый ранг массива

  • CS0178: недопустимый описатель ранга: ожидаемый "," или "]"
  • CS0650: недопустимый декларатор массива. Чтобы объявить управляемый массив, описатель ранга предшествует идентификатору переменной. Чтобы объявить поле буфера фиксированного размера, используйте фиксированное ключевое слово перед типом поля.
  • CS1552: описатель типа массива, []должен отображаться перед именем параметра

Чтобы правильно объявить массивы, выполните правильный порядок синтаксиса. Дополнительные сведения см. в разделе "Массивы " и " Спецификация языка C# " для инициализаторов массивов.

Объявление массива состоит из этих токенов в порядке:

  1. Тип элементов массива (например, intили stringSomeClassType).
  2. Квадратные скобки массива, которые при необходимости могут включать запятые для указания нескольких измерений.
  3. Имя переменной.

При указании измерений массива можно использовать следующее:

  • Ряд элементов в фигурных скобках ({ и })
  • Пустые квадратные скобки
  • Одна или несколько запятых, заключенные в квадратные скобки

В следующих примерах представлены допустимые объявления массивов:

int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;

Недопустимая длина массива

  • CS0248: невозможно создать массив с отрицательным размером
  • CS0270: размер массива нельзя указать в объявлении переменной (попробуйте инициализировать с помощью выражения new)
  • CS1586: создание массива должно иметь размер массива или инициализатор массива

Чтобы создать массивы с допустимой длиной, укажите размер во время инициализации, а не во время объявления. Дополнительные сведения см. в статье Arrays (C++/CLI and C++/CX) (Массивы (C++/CLI и C++/CX)).

  • Укажите длину массива как часть инициализации, а не объявления (CS0270).
  • Используйте только положительные целые числа для измерений массива (CS0248).
  • Укажите размер в new выражении или инициализаторе массива (CS1586).

В следующем примере показаны оба механизма:

int[] fiveIntegers = new int[5];
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

Недопустимый тип элемента

  • CS0611: элементы массива не могут иметь тип "type"
  • CS0719: элементы массива не могут быть статическим типом
  • CS0820: не удается назначить инициализатор массива неявным типизированным локальным
  • CS0826: не найден лучший тип для неявно типизированного массива

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

  • Не используйте ограниченные типы, такие как System.TypedReference и System.ArgIterator типы элементов массива (CS0611).
  • Не используйте static классы в качестве типов элементов массива, так как экземпляры не могут быть созданы (CS0719).
  • Инициализировать неявно типизированные массивы через выражение new (CS0820).
  • Убедитесь, что все элементы в инициализаторе неявно типизированного массива имеют лучший распространенный тип (CS0826).

В следующих примерах показано, как объявить неявно типизированные массивы:

var implicitType = new[] { 1, 2, 3 };
        
char c = 'c';
short s1 = 0;
short s2 = -0;
short s3 = 1;
short s4 = -1;

// common type is "int"
var commonType = new[] { s1, s2, s3, s4, c, 1 };

Чтобы обеспечить лучший распространенный тип, используйте любой из следующих методов:

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

Недопустимый инициализатор массива

  • CS0623: инициализаторы массивов могут использоваться только в инициализаторе переменных или полей. Попробуйте использовать новое выражение.
  • CS0846: ожидается инициализатор вложенного массива
  • CS1925: не удается инициализировать объект типа type с инициализатором коллекции.

Эти ошибки указывают на недопустимый синтаксис инициализатора массива. Дополнительные сведения см. в статье Arrays (C++/CLI and C++/CX) (Массивы (C++/CLI и C++/CX)).

Чтобы создать допустимые инициализаторы массива, выполните приведенные далее действия.

  • Инициализаторы массива используются только в объявлениях переменных или полей (CS0623). new Используйте выражение в других контекстах.
  • Балансируйте фигурные скобки ({ и }) вокруг элементов или дочерних массивов (CS0846).
  • Убедитесь, что выражение инициализации соответствует количеству массивов в инициализации зубчатого массива.
  • Инициализаторы коллекций используются только с типами коллекций, а не с массивами или другими типами (CS1925).

Построитель недопустимых коллекций

  • CS9175: дерево выражений может не содержать выражения коллекции.
  • CS9177: тип возвращаемого значения метода построителя CollectionBuilderAttribute должен соответствовать типу коллекции, используемому в улучшении.
  • CS9178: для естественного типа "type" нет целевого типа.
  • CS9179: тип выражения коллекции должен иметь применимый конструктор, который можно вызывать без аргументов.
  • CS9180: метод построителя CollectionBuilderAttribute должен быть статическим методом.
  • CS9181: тип параметра метода построителя CollectionBuilderAttribute должен соответствовать параметру ReadOnlySpan<{0}>.
  • CS9182: Недопустимый 'CollectionBuilderAttribute'. Соответствующий метод '{0}' не найден в типе построителя '{1}'.
  • CS9183: тип возвращаемого метода CollectionBuilderAttribute должен быть не абстрактным типом интерфейса, который можно использовать в качестве типа.
  • CS9185: статический тип нельзя использовать в качестве аргумента типа.
  • CS9186: CollectionBuilderAttribute недопустимое имя метода.
  • CS9187: Не удалось найти доступный метод 'Create' с ожидаемой сигнатурой: статический метод с одним параметром типа 'ReadOnlySpan<{0}>' и типом возврата '{1}'.
  • CS9188: "scoped" нельзя использовать в качестве модификатора для параметра типа выражения коллекции.
  • CS9190: метод CollectionBuilderAttribute "builderMethod" является неприменимым, так как он является универсальным.
  • CS9192: встроенные преобразования массивов нельзя использовать с выражениями коллекций.
  • CS9193: Аргумент "аргумент" нельзя передавать с ключевым словом "ref".
  • CS9194: Аргумент 'argument' не должен быть передан с ключевым словом out
  • CS9195: аргумент "аргумент" не может быть передан с ключевым словом "in"
  • CS9196: функция "выражение коллекции" недоступна в C# "версия". Используйте языковую версию "requiredVersion" или более поздней.
  • CS9197: Функция 'встроенные массивы' недоступна в C# 'версии'. Используйте языковую версию 'requiredVersion' или более позднюю.
  • CS9198: Функциональность "ref и unsafe в методах async и iterator" недоступна в C# "version". Пожалуйста, используйте языковую версию "requiredVersion" или более позднюю.
  • CS9199: функция "выражение коллекции" недоступна в C# "версия". Используйте языковую версию "requiredVersion" или более поздней.
  • CS9202: Возможность "ref readonly parameters" недоступна в версии C# "version". Используйте версию языка "requiredVersion" или выше.
  • CS9208: оператор nameof нельзя использовать в доступе к встроенному массиву.
  • CS9209: возвращаемое свойство ref не может использоваться в качестве аргумента значения.
  • CS9211: выражение должно быть типа "тип", так как оно присваивается по ссылке
  • CS9212: не удается использовать выражение коллекции в качестве значения в фиксированной инструкции
  • CS9217: локальный параметр "ref" нельзя сохранить в пределах границы "await" или "yield".
  • CS9218: paramName является структурой ссылок и не может быть типом параметра
  • CS9221: Тип "type" не может быть ссылочной структурой или параметром типа, допускающим ссылочные структуры, чтобы использовать его в качестве параметра "параметр" в универсальном типе или методе "member".
  • CS9223: структура, содержащая поля ref, не может использоваться в выражении коллекции.
  • CS9228: объявление не переменной структуры ссылок запрещено
  • CS9232: объявления частичных методов имеют различия между сигнатурами.
  • CS9233: модификатор file можно использовать только для типов, определенных на верхнем уровне в единице компиляции.

Чтобы правильно создать выражения коллекции с атрибутами построителя коллекций, следуйте этим требованиям. Дополнительные сведения см. в разделе "Выражения коллекции".

  • Убедитесь, что целевой тип имеет тип итерации, поддерживающий foreach (CS9188).
  • Не используйте универсальные типы в качестве типов построителя коллекций (CS9185).
  • Проверьте, допустимо ли имя метода, указанное в CollectionBuilderAttribute (CS9186).
  • Применяется CollectionBuilderAttribute только к статическим методам, которые соответствуют требуемой сигнатуре: возвращают тип коллекции и принимают ReadOnlySpan<T> параметр, где T соответствует типу элемента (CS9180, CS9181, CS9182, CS9183, CS9187, CS9190).
  • Убедитесь, что возвращаемый тип совпадает и не является абстрактным или интерфейсом (CS9177, CS9183).
  • Не используйте структуры ссылок или типы с полями ссылок в выражениях коллекции (CS9218, CS9221, CS9223, CS9228).
  • Избегайте использования выражений коллекции в деревах выражений (CS9175).
  • Используйте правильную версию языка для выражений коллекции и связанных функций (CS9196, CS9197, CS9198, CS9199, CS9202).

Предупреждения спецификации общего языка

  • CS3007: перегруженный метод "method" отличается только по неименованным типам массивов не соответствует CLS.
  • CS3016: массивы в качестве аргументов атрибутов не соответствуют clS

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

  • Не создавайте перегруженные методы, которые отличаются только в типах элементов массива (CS3007).
  • Не используйте массивы в качестве аргументов атрибутов (CS3016).

CS3007 возникает, если у вас есть перегруженный метод, принимаюющий массив, и единственное различие между сигнатурами метода — это тип элемента массива. Чтобы избежать этой ошибки, рассмотрите возможность использования прямоугольного массива, а не массива с замеченным массивом или, если соответствие CLS не требуется, удалите CLSCompliantAttribute атрибут. Дополнительные сведения о соответствии спецификации CLS см. в разделе Независимость от языка и независимые от языка компоненты.

CS3016 указывает, что не соответствует спецификации CLS, чтобы передать массив атрибуту. Дополнительные сведения о соответствии CLS см. в статье о независимости языка и независимых от языка компонентах.