IEnumerable<T>
- интерфейс только для чтения - он предназначен только для представления «последовательности».
Инициализаторам коллекции для работы требуется Add
, но они проверяют, что тип сначала реализует IEnumerable
, чтобы убедиться, что это действительно тип коллекции некоторого описания. Им не требуется универсальная форма, так как это было бы ограничительным для некоторого кода до версии 2.0 (в частности, различные коллекции пользовательского интерфейса не поддерживают IEnumerable<T>
IIRC), и они не требуют специфических Add
подпись в качестве инициализаторов коллекции может использоваться с разным количеством аргументов. Например, Dictionary<TKey, TValue>
имеет Add(TKey value, TValue value)
, поэтому вы можете использовать:
var dictionary = new Dictionary<string, int>
{
{ "Jon", 33 },
{ "Tom", 6 }
};
Это означает, что он не может быть ограничен (скажем) IList
, который имеет только метод с одним аргументом Add
. В некоторой степени требуется утка, но требование IEnumerable
является попыткой убедиться, что Add
действительно означает «добавить элемент в коллекцию», а не что-то совершенно иное. Компилятор не использует тот факт, что он реализует IEnumerable
- он никогда не вызывает GetEnumerator
, например, при построении коллекции.