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
, который имеет только одну argumnet Add
метод. В какой-то мере требуется утка, но требование IEnumerable
- это попытка убедиться, что Add
действительно означает «добавить элемент в коллекцию», а не что-то совершенно другое. Компилятор не использует тот факт, что он реализует IEnumerable
- он никогда не звонит GetEnumerator
при создании коллекции, например.
из первоисточника здесь: http://escrow.aliexpress.com : //blogs.msdn.com/madst/archive/2006/10/10/What-is-a-collection_3F00_.aspx – LukeH
Стоит отметить, что 'foreach' использует утиную печать на' IEnumerable', поэтому можно перебирать что-то, используя 'foreach', не имея возможности использовать инициализаторы коллекции на нем. – thecoop