2013-05-16 3 views
4

Si je comprends bien, C# a une syntaxe pour écrire des tableaux en tant que tels: { 1, 2, 3 }. Pourquoi est-ce invalide:Pourquoi les tableaux ne sont-ils autorisés qu'à certains endroits?

x = { 1, 2, 3 }.GetLength(0); 

alors que ceci est valide?

int[] numbers = { 1, 2, 3 }; 
x = numbers.GetLength(0); 

est-ce pas le type de données de l'expression { 1, 2, 3 } le même que numbers?

+0

Vous obtiendrez probablement une bonne réponse, mais vous pourriez trouver cela utile http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx –

Répondre

7

La syntaxe à laquelle vous faites référence est un objet initialiseur de collection. C'est utile lors de l'initialisation d'une instance de différents types. Il ne crée pas, en lui-même, une instance d'un type donné.

Par exemple, vous pouvez l'utiliser pour déclarer des tableaux:

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

Listes:

List<int> nums = new List<int> { 1, 2, 3 }; 

Dictionnaire:

Dictionary<string, int> pairs = { { "One", 1 }, { "Two", 2 }, { "Three", 3 } }; 

Vous pouvez encore des choses inline pour atteindre votre intention initiale avec un peu plus de code:

new[] { 1, 2, 3 }.GetLength(0); 
+0

Non, ce n'est pas un initialiseur d'objet. C'est un initialiseur de tableau. –

+0

@JonSkeet - N'est-ce pas techniquement un initialiseur de collection? –

+1

Non, pas seul - ou plutôt, pas dans le contexte spécifié par le PO. J'ai ajouté des références de spécification à ma réponse. Les initialiseurs de collection font partie des expressions d'initialisation d'objet - il s'agit simplement d'un initialiseur de tableau. (Gardez à l'esprit que les initialiseurs de collection sont valides depuis C# 1, alors que les initialiseurs et initialiseurs d'objets n'ont été ajoutés qu'en C# 3.) –

9

Les tableaux sont autorisés partout - mais vous ne pouvez utiliser cette syntaxe particulière (qui est appelée pour les créer initialiseur de tableau dans le cadre d'une déclaration de variable - ou dans le cadre d'une expression plus large appelé une expression de création de tableau .

Vous pouvez toujours créer eux cependant:

x = new int[] { 1, 2, 3 }.GetLength(0); 

donc dans ce cadre, new int[] { 1, 2, 3 } est l'expression de la création de la matrice, et la partie { 1, 2, 3 } est le initialiseur de tableau.

Les expressions de création de tableau sont décrites à la section 7.6.10.4 de la spécification C# 5, et les initialiseurs de tableau sont décrits à la section 12.6.

2

x = new[] { 1, 2, 3 }.GetLength(0); vous obtiendrez ce que vous voulez puisque {1, 2, 3} n'est pas en soi un tableau, mais plutôt un tableau initialiseur. Et GetLength() fonctionne avec le premier mais pas le dernier.

Questions connexes