Инициализатор коллекции и исключение TypeInitializationException против IEnumerable

Я использовал инициализатор коллекции для 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)? Я упустил что-то важное?


person sharpener    schedule 30.09.2014    source источник
comment
К вашему сведению, оба перечисления специальных папок имеют одинаковые значения (Personal = 5, MyDocuments = 5) и _ 3_ проверяет, равны ли значения двух экземпляров. Так что это перечисление действительно плохой кандидат на ключ словаря.   -  person Tim Schmelter    schedule 30.09.2014
comment
Интересный вопрос, я ожидал, что для этого потребуется что-то вроде IList, что обеспечит Add и, как побочный эффект, интерфейс IEnumerable, но это не так.   -  person C.Evenhuis    schedule 30.09.2014
comment
Разыменовывание одного из ответов на упомянутый вопрос, который я дублирую - очень подробное обсуждение здесь: blogs.msdn.com/b/madst/archive/2006/10/10/   -  person sharpener    schedule 30.09.2014