Подтвердить что ты не робот

Почему я не могу использовать синтаксис инициализации массива отдельно от объявления массива?

Я могу сделать это с целым числом:

int a;
a = 5;

Но я не могу сделать это с целым массивом:

int[] a;
a = { 1, 2, 3, 4, 5 };

Почему бы и нет?

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

int[] a = { 1, 2, 3, 4, 5 };

Что было бы эквивалентно:

int a = 5;

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

4b9b3361

Ответ 1

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

Вот почему это работает:

int[] a = { 1, 2, 3, 4, 5 };

но это не так:

int[] a;
a = { 1, 2, 3, 4, 5 };

Могли бы они добавить синтаксис, чтобы это разрешить? Конечно, но они этого не сделали. Скорее всего, они чувствовали, что эта утилита так редко используется, что она не требует определения приоритетов по другим функциям. Все новые функции начинаются с минус 100 пунктов, и это, вероятно, просто не занимает достаточно высокое место в списке приоритетов.

Обратите внимание, что { 1, 2, 3, 4, 5 } сам по себе не имеет смысла, он может появляться только в двух местах:

  • Как часть объявления переменной массива:

    int[] a = { 1, 2, 3, 4, 5 };
    
  • Как часть выражения создания массива:

    new int[] { 1, 2, 3, 4, 5 }
    

Число 5, с другой стороны, имеет смысл везде, где он появляется в С#, поэтому это работает:

int a;
a = 5;

Итак, это просто специальный синтаксис, который разработчики С# решили поддержать, не более того.

Этот синтаксис описан в спецификации С#, раздел 12.6 Инициализаторы массивов.

Ответ 2

Причина, по которой ваш массив не работает, объясняется различием между значениями и ссылочными типами. int - тип значения. Это одно место в памяти, значение которого может быть изменено.

Ваш целочисленный массив является ссылочным типом. Это не эквивалентно постоянному количеству байтов в памяти. Следовательно, это указатель на байты, в которых хранятся эти данные.

В этой первой строке вы присваиваете null a.

int[] a;

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

a = new[] {1, 2, 3, 4, 5};

Вот почему вам нужно new[] перед списком значений в массиве, если вы решительно введите свое объявление.

int[] a = {1, 2, 3, 4, 5}; // This will work.
var a = {1, 2, 3, 4, 5}; // This will not.

Однако, как и многие другие ответы, если вы объявляете это в одной строке, вам не нужен new[]. Если вы разделите объявление и инициализацию, вам необходимо использовать new[].

Ответ 3

Это синтаксис для инициализации массива int:

var a = new int[] { 1, 2, 3, 4, 5 };

int[] является избыточным, так как тип может быть задан заданными значениями в массиве. Поэтому вы можете написать:

var a = new[] { 1, 2, 3, 4, 5 };

Ответ 5

{} Синтаксис доступен для инициализации массива, который не должен использоваться после объявления.

Ответ 6

var a = new int[] { 1, 2, 3, 4, 5 }; - инициализация массива с указанием типа.

var a = new[] { 1, 2, 3, 4, 5 }; или var a = { 1, 2, 3, 4, 5 }; - инициализация массива без указания типа; тип найден по типу элементов массива.

Ответ 7

Тип и длина массивов должны быть установлены в первый раз:

int[] array = new int[5] { 1 , 2 , 3 , 4 , 5}

если вы хотите добавить к нему элементы позже, вы можете использовать списки:

var myList = new List<int>();
myList.Add(1);
myList.AddRange(new [] {2 , 3 , 4 , 5})

Вы можете получить результат своих списков в виде массива:

var result = myList.ToArray(); //result is an array of {1,2,3,4,5} values.