Saya menemukan berikut ini dan saya bertanya-tanya mengapa itu tidak menimbulkan kesalahan sintaksis.
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
}
}
};
Perhatikan bahwa "," tidak ada di antara "MyA", dan "OtherAs".
Di sinilah kebingungan terjadi:
- Kode mengkompilasi.
- Kamus terakhir "dict" hanya berisi tiga elemen: "Id", "Tribes", dan "MyA".
- Nilai untuk semua kecuali "MyA" benar,
- "MyA" mengambil nilai yang dinyatakan untuk "OtherAs", sementara nilai aslinya diabaikan.
Mengapa ini tidak ilegal? Apakah ini berdasarkan desain?
c#
dictionary
initialization
Dantte
sumber
sumber
OtherAs
akan ditambahkan sebagai kunci ke dalam apa yang akan menjadi yangMyA
kamus. (Nama = Solo, Poin = 88 plus OtherAs = Daftar <Kamus <string, objek >>) kecuali kemudian tidak pernah menetapkannya . Alih-alih itu menempatkan daftar dicts, sekarang hanya berisi entri Points = 1999 tunggal ke dalamMyA
slot yang menimpa apa yang dipikirkan orang di sana.<string, string> and modify Points to
"88" `Anda kemudian mendapatkan kesalahan kompiler" Tidak dapat secara implisit mengonversi tipe 'System.Collections.Generic.List <System.Collections.Generic.Dictionary <string, object >>' to 'string' " yang sebenarnya membantu saya mengetahui jawabannya!var test = new Dictionary<string, object> { ["Name"] = "Solo", ["Points"] = 88 }["OtherAs"] = new List<Dictionary<string, object>> { new Dictionary<string, object> { ["Points"] = 1999 } };
akan jelaskan lebih lanjut.Jawaban:
Koma yang hilang membuat semua perbedaan. Itu menyebabkan pengindeks
["OtherAs"]
diterapkan pada kamus ini:Jadi intinya Anda mengatakan:
Perhatikan bahwa ini adalah ekspresi penugasan (
x = y
). Berikutx
adalah kamus dengan "Nama" dan "Poin", diindeks dengan"OtherAs"
dany
adalahList<Dictionary<string, object>>
. Ekspresi penugasan mengevaluasi nilai yang diberikan (y
), yang merupakan daftar kamus.Hasil dari seluruh ekspresi ini kemudian ditugaskan ke kunci "MyA", itulah sebabnya "MyA" memiliki daftar kamus.
Anda dapat mengonfirmasi bahwa inilah yang terjadi dengan mengubah jenis kamus
x
:Ini kode Anda, tetapi diformat ulang dan beberapa tanda kurung ditambahkan untuk menggambarkan bagaimana kompiler menguraikannya:
sumber
object
kestring
yang memberi saya pesan kesalahan yang sama dan aha saat itu memicu jawabannya. Sepertinya Anda mengalahkan saya untuk itu - saya salah mengetik jawaban di ponsel saya :-pApa yang terjadi di sini adalah Anda membuat kamus dan kemudian mengindeksnya. Hasil dari pengindeksan / ekspresi tugas kemudian dikembalikan dan itulah yang ditugaskan ke dalam
MyA
slot kamus.Ini:
Dapat dibagi menjadi kode-psuedo berikut:
Hasil penugasan ke pengindeks kamus kedua dikembalikan (penugasan mengembalikan nilai yang ditugaskan / sisi kanan) Kamus itu adalah lokal sementara yang hanya "menghilang ke dalam eter". Hasil pengindeks (daftar kamus) adalah apa yang ditempatkan di kamus utama pada akhirnya.
Ini adalah kasus yang aneh, yang dibuat lebih mudah karena penggunaan
object
sebagai jenis nilai kamus.sumber