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

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

  • CS0022: неправильное число индексов внутри [], ожидаемое "число"
  • CS0178: недопустимый описатель ранга: ожидаемый "," или "]"
  • CS0248: невозможно создать массив с отрицательным размером
  • CS0270: размер массива нельзя указать в объявлении переменной (попробуйте инициализировать с выражением 'new')
  • CS0611: элементы массива не могут быть типами
  • CS0623: инициализаторы массивов могут использоваться только в инициализаторе переменных или полей. Попробуйте использовать новое выражение.
  • CS0650: недопустимый декларатор массива. Чтобы объявить управляемый массив, описатель ранга предшествует идентификатору переменной. Чтобы объявить поле буфера фиксированного размера, используйте фиксированный ключевое слово перед типом поля.
  • CS0719: элементы массива не могут быть статическим типом
  • CS0747: недопустимый декларатор элемента инициализатора.
  • CS0820: не удается назначить инициализатор массива неявным типизированным локальным
  • CS0826: не найден лучший тип для неявно типизированного массива.
  • CS0846: ожидается инициализатор вложенного массива
  • CS1552: описатель типа массива, []должен отображаться перед именем параметра
  • CS1586: создание массива должно иметь размер массива или инициализатор массива
  • CS1920: инициализатор элементов не может быть пустым.
  • CS1921: лучший перегруженный метод соответствует неправильной сигнатуре для элемента инициализатора. Инициализируемый Add должен быть доступным методом экземпляра.
  • CS1925: не удается инициализировать объект типа type с инициализатором коллекции.
  • CS1954: нельзя использовать лучший перегруженный метод для элемента инициализатора коллекции. Методы инициализатора коллекции "Add" не могут иметь ref или out параметры.
  • CS9174: не удается инициализировать тип с помощью литерала коллекции, так как тип не является конструктором.
  • CS9176: для литерала коллекции нет целевого типа.
  • CS9185: тип построителя CollectionBuilderAttribute должен быть не универсальным классом или структурой.
  • CS9186: недопустимое имя метода CollectionBuilderAttribute.
  • CS9187: не удалось найти доступный метод с ожидаемой сигнатурой: статический метод с одним параметром типа ReadOnlySpan<T>; и правильный тип возвращаемого значения
  • CS9188: Тип имеет коллекцию CollectionBuilderAttribute, но не тип элемента.
  • CS9203: выражение коллекции этого типа нельзя использовать в этом контексте, так как оно может быть предоставлено за пределами текущей область.
  • CS9210: эта версия System.Collections.Immutable.ImmutableArray<T>не может использоваться с выражениями коллекции.

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

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

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

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

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

  • CS0747: недопустимый декларатор элемента инициализатора.
  • CS1920: инициализатор элементов не может быть пустым.
  • CS1921: лучший перегруженный метод соответствует неправильной сигнатуре для элемента инициализатора. Инициализируемый Add должен быть доступным методом экземпляра.
  • CS1954: нельзя использовать лучший перегруженный метод для элемента инициализатора коллекции. Методы инициализатора коллекции "Add" не могут иметь ref или out параметры.
  • CS9174: не удается инициализировать тип с помощью литерала коллекции, так как тип не является конструктором.
  • CS9176: для литерала коллекции нет целевого типа.
  • CS9203: выражение коллекции этого типа нельзя использовать в этом контексте, так как оно может быть предоставлено за пределами текущей область.
  • CS9210: эта версия System.Collections.Immutable.ImmutableArray<T>не может использоваться с выражениями коллекции.

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

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

Все ошибки указывают, что код, созданный компилятором для инициализатора коллекции, недопустим. Проверьте следующее:

  • Инициализатор коллекции содержит последовательность элементов. Нельзя смешивать свойства параметров в экземпляре коллекции с добавлением элементов в один и тот же инициализатор.
  • Инициализатор коллекции, включающий фигурные скобки ({ и }) не может быть пустым.
  • Add Соответствующий метод должен быть доступен и принимать один параметр, который является тем же типом, что и элементы коллекции. Параметр не может включать ref или out модификатор.
  • Разрешение перегрузки должно выбрать один Add метод в качестве лучшего соответствия. Не может быть нескольких методов сопоставления, которые одинаково хороши.
  • Выражения коллекции могут инициализировать явно типизированные переменные типа коллекции. Если переменная не является типом коллекции или массива или неявно типизированным (с помощью var), инициализатор коллекции нельзя использовать.
  • ref struct Тип, напримерSystem.Span<T>, нельзя инициализировать с выражением коллекции, которое может нарушить безопасность ссылок.
  • Выражение коллекции не может правильно инициализировать текущую System.Collections.Immutable.ImmutableArray<T> версию. Используйте другую версию среды выполнения или измените выражение инициализации.

Предупреждения указывают на то, что выражение коллекции, включая любые элементы распространения, могут выделить память. Создание другого хранилища и преобразование может быть более эффективным.

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

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

Эти ошибки указывают на то, что вы создали недопустимый инициализатор. Вероятно, причиной является несбалансированные фигурные скобки { и } вокруг одного или нескольких элементов или дочерних массивов. Убедитесь, что выражение инициализации соответствует количеству массивов в инициализации многомерного массива и что фигурные скобки сбалансированы.

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

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

Доступ к элементу массива можно получить, указав индекс для каждой оси, объявленной в массиве. Индексы находятся между [] и после имени массива. Существует два правила для индексов массива:

  1. Необходимо указать то же количество индексов, что и в объявлении массива. Если массив имеет одно измерение, необходимо указать один индекс. Если массив имеет три измерения, необходимо указать три индекса.
  2. Все индексы должны быть неотрицательных целых чисел.

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

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

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

  1. Тип элементов массива. Например, int, string или SomeClassType.
  2. Квадратные скобки массива, в том числе запятые для представления нескольких измерений.
  3. Имя переменной.

Если инициализация массива задает измерения массива, можно указать следующие свойства:

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

Например, ниже приведены допустимые объявления массива:

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

Дополнительные сведения см. в разделе спецификации C# (спецификация языка C#) для инициализаторов массивов.

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

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

Длина каждого измерения массива должна быть указана как часть инициализации массива, а не его объявление. Длина каждого измерения должна быть положительной. Можно указать длину либо с помощью new выражения для выделения массива, либо с помощью инициализатора массива для назначения всех элементов. В следующем примере показаны оба механизма:

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

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

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

Имеется несколько типов, которые нельзя использовать в качестве типа массива. К этим типам относятся System.TypedReference и System.ArgIterator. Тип массива не может быть классом static , так как экземпляры static класса не могут быть созданы.

Вы можете объявить массивы как неявно типизированные локальные переменные. Массив должен быть инициализирован с помощью new выражения. Кроме того, все элементы в инициализаторе массива должны иметь лучший распространенный тип. В следующих примерах показано, как объявить неявно типизированный массив:

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 };

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

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

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

Следующие ошибки указывают на ошибки в типе построителя коллекций:

  • CS9185: CollectionBuilderAttribute тип построителя должен быть не универсальным классом или структурой.
  • CS9186: CollectionBuilderAttribute недопустимое имя метода.
  • CS9187: не удалось найти доступный метод с ожидаемой сигнатурой: статический метод с одним параметром типа ReadOnlySpan<T>; и правильный тип возвращаемого значения.
  • CS9188: тип имеет тип, но не имеет CollectionBuilderAttribute типа элемента.

Эти ошибки указывают на то, что тип построителя коллекций нуждается в изменении. Помните следующие правила:

  • Тип коллекции должен иметь тип итерации. Другими словами, тип можно использовать foreach как коллекцию.
  • Тип построителя коллекций не может быть универсальным типом.
  • Имя метода, указанное System.Runtime.CompilerServices.CollectionBuilderAttribute в поле, должно быть допустимым именем метода. Например, его нельзя завершить или другое имя, содержащее недопустимые символы идентификатора.
  • Метод построителя коллекций должен быть доступным статическим методом. Он должен возвращать тип коллекции, и он должен принимать параметр, ReadOnlySpan<T> в котором T соответствует типу элемента коллекции.

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

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

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

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