Więcej
Jaka jest prawidłowa inicjalizacja słownika C#?
Potknąłem się o to i zastanawiam się, dlaczego nie spowodowało to błędu składniowego.
var dict = nowy Słownik<ciąg, obiekt>
{
["Id"] = Guid.NewGuid(),
["Tribes"] = nowa lista<int> { 4, 5 },
["MyA"] = nowy słownik< sznurek, obiekt>
{
["Name"] = "Solo",
["Punkty"] = 88
}
["OtherAs"] = nowa lista<Słownik<ciąg, obiekt>>
{
Nowy Słownik<ciąg, obiekt>
{
["Punkty"] = 1999 r.
}
}
};
Zauważ, że brakuje "," pomiędzy "MyA", a "OtherAs".
To tu się dzieje zamieszanie:
- Kod się kompiluje.
- Ostateczny słownik "dyktando" zawiera tylko trzy elementy: "Id", "Tribes", i "MyA".
- Wartości dla wszystkich oprócz "MyA" są prawidłowe,
- "MyA" przyjmuje zadeklarowaną wartość dla "OtherAs", podczas gdy jego pierwotna wartość jest ignorowana.
Dlaczego to nie jest nielegalne? Czy to z założenia?
55
2
Brakujący przecinek robi całą różnicę. Powoduje on, że na tym słowniku stosowany jest indekser
["OtherAs"]
:Więc w zasadzie mówisz:
Zauważ, że jest to wyrażenie przypisania (
x = y
). Tutajx
jest słownikiem z "Nazwą" i "Punktami", indeksowanym przez"InneAs"
, ay
jestList
. Wyrażenie przypisujące ocenia przypisywaną wartość (y
), która jest listą słowników.Wynik tego całego wyrażenia jest następnie przypisywany do klawisza "MyA", dlatego też "MyA" posiada listę słowników.
Możesz potwierdzić, że tak właśnie się dzieje, zmieniając typ słownika
x
:Oto twój kod, ale przeformatowany i kilka nawiasów dodanych do ilustracji jak kompilator go przetworzył:
To, co się tutaj dzieje, to tworzenie słownika, a następnie indeksowanie do niego. Następnie zwracany jest wynik wyrażenia indexer/assignment i to właśnie jest przypisywane do slotu słownika
MyA
.To:
Może być podzielony na następujące kody psujące:
Wynik przypisania do indeksera drugiego słownika jest zwracany (przypisanie zwraca wartość przypisaną/prawą stronę) Ten słownik jest tymczasowym lokalnym, który po prostu "znika w eterze". Wynik indeksu (lista słowników) jest tym, co na końcu znajduje się w głównym słowniku.
Jest to dziwny przypadek, do którego łatwiej wpaść dzięki użyciu
obiektu
jako typu wartości słownika.