2010-05-16 4 views
1

En MonoDevelop je le code suivant qui compile:Pourquoi `new int [x] {}` ne serait-il pas valide?

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

Cependant, au moment de l'exécution, je reçois:

Matrix.cs (53,53): Erreur CS0150: Une constante valeur est attendue (CS0150) (testmatrix)

Je sais ce que cela signifie d'erreur et me force à redimensionner le tableau:

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

Est-ce quelque chose que j'ai juste à faire parce que j'utilise MonoDevelop sous Linux? J'étais certain que sous .Net 3.5 j'étais capable d'initialiser un tableau avec une variable contenant la largeur du tableau. Quelqu'un peut-il confirmer que c'est isolé? Si c'est le cas, je peux signaler le bug à bugzilla.

+0

Le problème est probablement parce que vous mixez l'initialisation et l'initialisation de l'objet tableau. Retirez le '{}' et vous devriez aller bien. Aussi, j'ai essayé d'initialiser ce tableau dans gsharp sur OpenSuse11.2 et il échoue immédiatement avec le '{}' inclus. –

Répondre

13

Vous ne pouvez pas mélanger la syntaxe de création de tableau avec la syntaxe d'initialisation d'objet. Retirez le { }.

Lorsque vous écrivez:

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

Vous créez un nouveau tableau de taille indices.Count initialisé aux valeurs par défaut.

Lorsque vous écrivez:

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

Vous créez un tableau, puis initialiser son contenu aux valeurs [1,2,3,4]. La taille du tableau est déduite du nombre d'éléments. Il est un raccourci pour:

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

Le tableau est toujours d'abord initialisé à défaut, cette syntaxe fournit juste un raccourci pour éviter havind d'écrire ces affectations supplémentaires vous.

+0

Doh !!! J'aurais du m'en souvenir. – IAbstract

1

Le code suivant ne peut pas compiler pour la même raison sur 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; 
} 

Toutefois, la suppression de l'initialisation de l'objet de la déclaration ({}) fait fonctionner.

1

En C#, si vous voulez déclarer un tableau vide la syntaxe doit être:

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

0

Parce que quand vous d'utiliser une syntaxe d'initialisation du réseau d'utilisation et de spécifier la taille du tableau

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

La taille du tableau est des informations superflues. Le compilateur peut déduire la taille de la liste d'initialisation.Comme d'autres l'ont dit, vous créez soit tableau vide:

int[] arr = new int[5]; 

ou utilisez la liste d'initialisation:

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