Saya menemukan berikut dan I'm bertanya-tanya mengapa itu tidak't meningkatkan kesalahan sintaks.
var dict = baru Kamus<string, objek> { ["Id"] = Guid.NewGuid(), ["Suku"] = new Daftar<int> { 4, 5 }, ["MyA"] = baru Kamus<string, objek> { [""] = "Solo", ["Poin"] = 88 } ["lain sebagai"] = new Daftar<Kamus<string, objek>> { baru Kamus<string, objek> { ["Poin"] = 1999 } } };
Perhatikan bahwa "," hilang antara "MyA", dan "lain sebagai".
Ini adalah di mana kebingungan terjadi:
Mengapa isn't ilegal ini? Ini by design?
Hilang koma membuat semua perbedaan. Hal itu menyebabkan pengindeks ["lain sebagai"]
untuk diterapkan pada kamus ini:
new Dictionary<string, object>
{
["Name"] = "Solo",
["Points"] = 88
}
Jadi pada dasarnya anda're mengatakan:
new Dictionary<string, object>
{
["Name"] = "Solo",
["Points"] = 88
}["OtherAs"] = new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
["Points"] = 1999
}
};
Perhatikan bahwa ini adalah sebuah tugas ekspresi (x = y
). Di sini x
adalah kamus dengan "" dan "Poin", diindeks dengan "lain sebagai"
dan y
adalah Daftar<Kamus<string, objek>>
. Tugas evaluasi ekspresi nilai yang diberikan (y
), yang merupakan daftar kamus.
Hasil ini seluruh ekspresi ini kemudian ditugaskan untuk kunci "MyA", yang mengapa "MyA" memiliki daftar kamus.
Anda dapat mengkonfirmasi bahwa ini adalah apa yang's terjadi dengan mengubah jenis kamus x
:
new Dictionary<int, object>
{
[1] = "Solo",
[2] = 88
}
// compiler error saying "can't convert string to int"
// so indeed this indexer is applied to the previous dictionary
["OtherAs"] = new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
["Points"] = 1999
}
}
Berikut ini adalah kode anda, tetapi diformat ulang dan menambahkan beberapa tanda kurung untuk menggambarkan bagaimana compiler telah diurai:
["MyA"]
=
(
(
new Dictionary<string, object>
{
["Name"] = "Solo",
["Points"] = 88
}["OtherAs"]
)
=
(
new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
["Points"] = 1999
}
}
)
)
Apa's terjadi di sini adalah bahwa anda membuat kamus dan kemudian pengindeksan ke dalamnya. Hasil dari pengindeks/tugas ekspresi ini kemudian kembali dan itulah yang semakin ditugaskan ke MyA
kamus slot.
Ini:
["MyA"] = new Dictionary<string, string>
{
["Name"] = "Solo",
["Points"] = "88"
}
["OtherAs"] = new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
["Points"] = 1999
}
}
Dapat dibagi menjadi berikut pseudo-code:
var temp = new Dictionary<string, object>
{
["Name"] = "Solo",
["Points"] = 88
};
// indexed contains result of assignment
var indexed = temp["OtherAs"] = new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
["Points"] = 1999
}
};
// value is set to result of assignment from previous step
["MyA"] = indexed;
// temp is discarded
Hasil dari menetapkan untuk pengindeks dari kedua kamus kembali (penugasan kembali nilai yang diberikan/kanan) Bahwa kamus adalah sementara lokal yang hanya "menghilang ke dalam eter". Hasil dari pengindeks (daftar kamus) yang ditempatkan ke dalam kamus utama di akhir.
Ini adalah kasus aneh, yang membuat lebih mudah untuk jatuh ke dalam karena penggunaan objek
sebagai jenis kamus nilai-nilai.