Le code suivant
new Dictionary<string, List> { ["a"] = {1}, };
Lève une KeyNotFoundException
moment de l’ KeyNotFoundException
, bien que {1} soit un tableau parfaitement bien formé (c’est-à-dire que int[] a = {1,2,3,4}
est un code valide). Changer la TValue
du Dictionary
en int[]
, lève un CS1061
moment de la CS1061
, mais pas cela (notez le new[]
ajout de tableau new[]
):
new Dictionary<string, IEnumerable> { ["a"] = new[]{1}, };
Pourquoi cela arrive-t-il?
Votre premier morceau de code utilise un initialiseur de collection, qui n’utilise pas d’atsortingbution logique, mais est destiné à appeler Add
sur une collection existante . En d’autres termes, ceci:
var x = new Dictionary> { ["a"] = {1}, };
est équivalent à:
var tmp = new Dictionary>(); var list = tmp["a"]; list.Add(1); var x = tmp;
Espérons que la raison pour laquelle la deuxième ligne de l’expansion jette une exception est évidente.
Une partie de votre erreur de raisonnement est la suivante:
bien que {1} soit un tableau parfaitement bien formé
Non ce n’est pas. La syntaxe {1}
signifie différentes choses dans différents contextes. Dans ce cas, il s’agit d’un initialiseur de collection. Dans la déclaration:
int[] a = { 1, 2, 3, 4 };
c’est un initialiseur de tableau. Cette syntaxe crée uniquement un nouveau tableau dans une déclaration de tableau ou dans le cadre d’une expression de création de tableau, par exemple new[] { 1, 2, 3, 4 }
.