Raison de KeyNotFoundException dans l’initialisation du dictionnaire

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 } .