Ich bin auf Folgendes gestoßen und frage mich, warum es keinen Syntaxfehler ausgelöst hat.
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
}
}
};
Beachten Sie, dass das "," zwischen "MyA" und "OtherAs" fehlt.
Hier passiert die Verwirrung:
- Der Code wird kompiliert.
- Das endgültige Wörterbuch "dict" enthält nur drei Elemente: "Id", "Tribes" und "MyA".
- Der Wert für alle außer "MyA" ist korrekt,
- "MyA" nimmt den deklarierten Wert für "OtherAs" an, während der ursprüngliche Wert ignoriert wird.
Warum ist das nicht illegal? Ist das beabsichtigt?
c#
dictionary
initialization
Dantte
quelle
quelle
OtherAs
als würde es zunächst als Schlüssel für dasMyA
Wörterbuch hinzugefügt . (Name = Solo, Punkte = 88 plus OtherAs = Liste <Wörterbuch <Zeichenfolge, Objekt >>), außer dass es dann nie zugewiesen wird . Stattdessen wird die Liste der Diktate platziert, die jetzt nur noch den Eintrag "Einzelpunkte = 1999" in denMyA
Slot enthält und überschreibt, was man für dort hingehört.<string, string> and modify Points to
"88" , wird ein Compilerfehler angezeigt. "Der Typ 'System.Collections.Generic.List <System.Collections.Generic.Dictionary <Zeichenfolge, Objekt >>' kann nicht implizit in 'Zeichenfolge' konvertiert werden." was mir tatsächlich geholfen hat, die Antwort herauszufinden!var test = new Dictionary<string, object> { ["Name"] = "Solo", ["Points"] = 88 }["OtherAs"] = new List<Dictionary<string, object>> { new Dictionary<string, object> { ["Points"] = 1999 } };
wird es weiter erklären.Antworten:
Das fehlende Komma macht den Unterschied. Dadurch wird der Indexer
["OtherAs"]
auf dieses Wörterbuch angewendet:Sie sagen also im Wesentlichen:
Beachten Sie, dass dies ein Zuweisungsausdruck (
x = y
) ist. Hierx
ist ein Wörterbuch mit "Name" und "Punkte", indiziert mit"OtherAs"
undy
ist dasList<Dictionary<string, object>>
. Ein Zuweisungsausdruck ergibt den zugewiesenen Wert (y
), bei dem es sich um die Liste der Wörterbücher handelt.Das Ergebnis dieses gesamten Ausdrucks wird dann dem Schlüssel "MyA" zugewiesen, weshalb "MyA" die Liste der Wörterbücher enthält.
Sie können bestätigen, dass dies der Fall ist, indem Sie den Typ des Wörterbuchs ändern
x
:Hier ist Ihr Code, aber neu formatiert und einige Klammern hinzugefügt, um zu veranschaulichen, wie der Compiler ihn analysiert hat:
quelle
object
instring
gab mir eine ähnliche Fehlermeldung und den Aha- Moment, der die Antwort auslöste. Scheint, als hättest du mich geschlagen - ich beschuldige die Eingabe der Antwort auf meinem Handy :-pWas hier passiert, ist, dass Sie ein Wörterbuch erstellen und dann darin indizieren. Das Ergebnis des Indexer- / Zuweisungsausdrucks wird dann zurückgegeben, und genau das wird dem zugewiesen
MyA
Wörterbuchsteckplatz .Diese:
Kann in folgenden Pseudocode aufgeteilt werden:
Das Ergebnis der Zuweisung an den Indexer des zweiten Wörterbuchs wird zurückgegeben (die Zuweisung gibt den zugewiesenen Wert / rechte Seite zurück). Dieses Wörterbuch ist ein temporäres lokales Wörterbuch, das nur "im Äther verschwindet". Das Ergebnis des Indexers (der Liste der Wörterbücher) wird am Ende in das Hauptwörterbuch eingefügt.
Dies ist ein seltsamer Fall, der aufgrund der Verwendung
object
als Typ der Wörterbuchwerte leichter zu erfassen ist.quelle