Je suis tombé sur ce qui suit et je me demande pourquoi cela n'a pas soulevé d'erreur de syntaxe.
var dict = new Dictionary<string, object>
{
["Id"] = Guid.NewGuid(),
["Tribes"] = new List<int> { 4, 5 },
["MyA"] = new Dictionary<string, object>
{
["Name"] = "Solo",
["Points"] = 88
}
["OtherAs"] = new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
["Points"] = 1999
}
}
};
Notez que le "," manque entre "MyA" et "OtherAs".
C'est là que la confusion se produit:
- Le code se compile.
- Le dictionnaire final "dict" ne contient que trois éléments: "Id", "Tribes" et "MyA".
- La valeur pour tous sauf "MyA" est correcte,
- "MyA" prend la valeur déclarée pour "OtherAs", tandis que sa valeur d'origine est ignorée.
Pourquoi n'est-ce pas illégal? Est-ce par conception?
c#
dictionary
initialization
Dantte
la source
la source
OtherAs
soit ajouté comme clé dans ce que serait leMyA
dictionnaire. (Nom = Solo, Points = 88 plus OtherAs = List <Dictionnaire <chaîne, objet >>) sauf qu'il ne l'affecte jamais . Au lieu de cela, il place la liste des pronostics, ne contenant désormais que la seule entrée Points = 1999 dans l'MyA
emplacement remplaçant ce que l'on pourrait penser y appartenir.<string, string> and modify Points to
"88" `vous obtenez alors une erreur de compilation" Impossible de convertir implicitement le type 'System.Collections.Generic.List <System.Collections.Generic.Dictionary <chaîne, objet >>' en 'chaîne' " ce qui m'a aidé à trouver la réponse!var test = new Dictionary<string, object> { ["Name"] = "Solo", ["Points"] = 88 }["OtherAs"] = new List<Dictionary<string, object>> { new Dictionary<string, object> { ["Points"] = 1999 } };
, expliquez-le plus en détail.Réponses:
La virgule manquante fait toute la différence. Il provoque l'application de l'indexeur
["OtherAs"]
sur ce dictionnaire:Vous dites donc essentiellement:
Notez qu'il s'agit d'une expression d'affectation (
x = y
). Voici lex
dictionnaire avec "Nom" et "Points", indexé avec"OtherAs"
ety
est leList<Dictionary<string, object>>
. Une expression d'affectation évalue la valeur affectée (y
), qui est la liste des dictionnaires.Le résultat de toute cette expression est ensuite affecté à la clé "MyA", c'est pourquoi "MyA" a la liste des dictionnaires.
Vous pouvez confirmer que c'est ce qui se passe en modifiant le type du dictionnaire
x
:Voici votre code, mais reformaté et quelques parenthèses ajoutées pour illustrer comment le compilateur l'a analysé:
la source
object
àstring
cela m'a donné un message d'erreur semblable et le aha moment qui a déclenché la réponse. On dirait que vous m'avez battu - je reproche de taper la réponse sur mon téléphoneCe qui se passe ici, c'est que vous créez un dictionnaire puis l'indexez. Le résultat de l'indexation / expression d'affectation est ensuite renvoyé et c'est ce qui est affecté dans l'
MyA
emplacement du dictionnaire.Cette:
Peut être divisé en code pseudo suivant:
Le résultat de l'affectation à l'indexeur du deuxième dictionnaire est renvoyé (l'affectation renvoie la valeur affectée / côté droit). Ce dictionnaire est un local temporaire qui "disparaît dans l'éther". Le résultat de l'indexeur (la liste des dictionnaires) est ce qui est finalement placé dans le dictionnaire principal.
Il s'agit d'un cas étrange, qui est plus facile à tomber en raison de l'utilisation de
object
comme type de valeurs de dictionnaire.la source