Дополнительно
Насколько корректна эта инициализация словаря в C#?
Я наткнулся на следующее, и мне интересно, почему это не вызвало ошибку синтаксиса.
var dict = new Dictionary<string, object>
{
["Id"] = Guid.NewGuid(),
["Племена"] = new List<int> { 4, 5 },
["MyA"] = new Dictionary<string, object>
{
["Имя"] = "Соло",
["Очки"] = 88
}
["OtherAs"] = new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
["Точки"] = 1999 г.
}
}
};
Обратите внимание, что "," отсутствует между "MyA" и "OtherAs".
Именно здесь и происходит путаница:
- Код компилируется.
- Итоговый словарь "dict" содержит только три элемента: "Id", "Tribes" и "MyA".
- Значения для всех элементов, кроме "MyA", верны,
- "MyA" принимает объявленное значение для "OtherAs", а его исходное значение игнорируется.
Почему это не является незаконным? Так задумано?
55
2
Пропущенная запятая делает всю разницу. Она заставляет индексатор
["OtherAs"]
быть примененным к этому словарю:То есть, по сути, вы говорите:
Обратите внимание, что это выражение присваивания (
x = y
). Здесьx
- это словарь с "Именем" и "Точками", индексированный с помощью"OtherAs"
, аy
- этоList
. Выражение присваивания оценивается в присваиваемое значение (y
), которое является списком словарей.Результат всего выражения присваивается ключу "MyA", поэтому "MyA" имеет список словарей.
Вы можете убедиться, что все происходит именно так, изменив тип словаря
x
:Вот ваш код, но переформатированный и с добавлением некоторых скобок, чтобы проиллюстрировать, как компилятор разобрал его:
Здесь происходит то, что вы создаете словарь, а затем индексируете его. Затем возвращается результат выражения индексации/присвоения, который и присваивается в слот словаря
MyA
.Это:
Можно разделить на следующие псевдокоды:
Возвращается результат присвоения индексатору второго словаря (присвоение возвращает присвоенное значение/правую часть) Этот словарь является временным локальным, который просто "исчезает в эфире". Результат работы индексатора (список словарей) - это то, что в итоге помещается в основной словарь.
Это странный случай, в который легче попасть из-за использования
object
в качестве типа значений словаря.