2010-05-16 4 views
1

В MonoDevelop я следующий код, который составляет:Почему бы не `new int [x] {}` быть действительным?

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

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

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

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

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

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

+0

Проблема, вероятно, потому, что вы смешиваете инициализации массива и инициализации объекта. Удалите '{}', и все будет хорошо. Кроме того, я попытался запустить этот массив в gsharp на OpenSuse11.2, и он немедленно скомпонован с включенным '{}'. –

ответ

13

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

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

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; 

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

+0

Doh !!! Я должен был это вспомнить. – IAbstract

1

Следующий код не компилировать по той же причине на 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; 
} 

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

1

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

ИНТ [] строка = новый INT [indices.Count];

0

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

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

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

int[] arr = new int[5]; 

или использовать список инициализации:

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