Почему `new int [x] {}` не будет действительным? - PullRequest
1 голос
/ 17 мая 2010

В MonoDevelop у меня есть следующий код, который компилируется:

int[] row = new int[indices.Count]{};

Однако во время выполнения я получаю:

Matrix.cs (53,53): Ошибка CS0150: A ожидается постоянное значение (CS0150) (TestMatrix)

Я знаю, что означает эта ошибка, и заставляет меня изменить размер массива:

int[] row = new int[indices.Count]{};
Array.Resize(ref row, rowWidth);

Это то, с чем мне просто нужно иметь дело, потому что я использую MonoDevelop в Linux? Я был уверен, что в .Net 3.5 я смог инициализировать массив с переменной, содержащей ширину массива. Кто-нибудь может подтвердить, что это изолирован? Если это так, я могу сообщить об ошибке в bugzilla.

Ответы [ 4 ]

13 голосов
/ 17 мая 2010

Нельзя смешивать синтаксис создания массива с синтаксисом инициализации объекта. Удалить { }.

Когда вы пишете:

int[] row = new int[indices.Count];

Вы создаете новый массив размером indices.Count, инициализированный по умолчанию.

Когда вы пишете:

int[] row = new int[] { 1, 2, 3, 4 };

Вы создаете массив и затем инициализируете его содержимое значениями [1,2,3,4]. Размер массива определяется по количеству элементов. Это сокращение для:

int[] row = new int[4];
row[0] = 1;
row[1] = 2;
row[2] = 3;
row[3] = 4;

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

1 голос
/ 17 мая 2010

В C #, если вы хотите объявить пустой массив, синтаксис должен быть:

int [] row = new int [indices.Count];

1 голос
/ 17 мая 2010

Следующий код не может быть скомпилирован по той же причине в Windows / .NET / LINQPad:

void Main()
{
    int[] row = new int[indices.Count]{};
    row[2] = 10;
    row.Dump();
}

// Define other methods and classes here
public class indices {
    public static int Count = 5;
}

Однако удаление инициализации объекта из объявления ({}) приводит к его работе.

0 голосов
/ 17 мая 2010

Потому что при использовании использовать синтаксис инициализации массива И указывать размер массива

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

Размер массива лишняя информация. Компилятор может определить размер из списка инициализации. Как уже говорили другие, вы либо создаете пустой массив:

int[] arr = new int[5];

или используйте список инициализации:

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