Я использовал инициализатор коллекции для Dictionary
и получил TypeInitializationException
:
public static Dictionary<Environment.SpecialFolder, string> specialFolders = new Dictionary<Environment.SpecialFolder, string>
{
// ...
{Environment.SpecialFolder.MyDocuments, "abc"},
// ...
{Environment.SpecialFolder.Personal , "def"},
// ...
};
Поскольку нет такой полезной информации, как InnerException
, стек вызовов или что-то еще, это сбивает с толку. Итак, я немного исследовал проблему и понял, что есть два ключа с одинаковым значением.
Что касается IL, этот синтаксис инициализатора коллекции преобразуется в вызовы Dictionary.Add(...)
, и поэтому вызов Add
два раза с одним и тем же ключом вызывает System.ArgumentException
(это внутреннее исключение, которое я ожидал бы в TypeInitializationException
). Итак, я эффективно ответил на свой первоначальный вопрос, но возник другой:
Почему класс должен реализовать IEnumerable
(и, таким образом, предоставить IEnumerator
) - который предназначен для чтения коллекции, а не для ее записи - когда, наконец, инициализатор коллекции преобразуется в вызов Add
(что не гарантирует присутствовать в классе через IEnumerable)? Я упустил что-то важное?
Personal = 5
,MyDocuments = 5
) и _ 3_ проверяет, равны ли значения двух экземпляров. Так что это перечисление действительно плохой кандидат на ключ словаря. - person Tim Schmelter   schedule 30.09.2014IList
, что обеспечитAdd
и, как побочный эффект, интерфейсIEnumerable
, но это не так. - person C.Evenhuis   schedule 30.09.2014