Как Массив наших пользовательских классов работает с foreach без реализованного IEnumerable? - PullRequest
2 голосов
/ 16 июня 2010

Этот длинный заголовок уже содержит все мои вопросы, поэтому я просто хочу привести пример

MyClass[] array

Как этот массив работает с Foreach без реализации метода интерфейса IEnumerable?

Ответы [ 4 ]

11 голосов
/ 16 июня 2010

Массив реализует IEnumerable. Цитата из документа:

В .NET Framework версии 2.0 Класс Array реализует System.Collections.Generic.IList (Т), System.Collections.Generic.ICollection (Т), а также System.Collections.Generic.IEnumerable (Т) универсальные интерфейсы. реализации предоставляются для массивов во время выполнения, и, следовательно, не видимая в документации сборка инструменты. В результате, общий интерфейсы не отображаются в Синтаксис объявления для массива класс, и нет ссылки темы для членов интерфейса, которые доступно только путем приведения массива к универсальный тип интерфейса (явный реализации интерфейса). Ключ что нужно знать, когда вы разыгрываете массив к одному из этих интерфейсов те члены, которые добавляют, вставляют или удалить элементы бросить NotSupportedException.

3 голосов
/ 16 июня 2010

Следующее от MSDN

В C # это не обязательно для класса коллекции, чтобы наследовать от IEnumerable и IEnumerator в порядке быть совместимым с foreach. Как долго поскольку у класса есть требуемый GetEnumerator, MoveNext, Reset и Current members , он будет работать с для каждого. Пропуск интерфейсов имеет преимущество, позволяющее вам определить тип возвращаемого значения Current для быть более конкретным, чем объект, который обеспечивает безопасность типов.

1 голос
/ 16 июня 2010

foreach не требует от типа для реализации интерфейса IEnumerable, ему просто нужен метод GetEnumerator ().

1 голос
/ 16 июня 2010

Тип структуры Array реализует IEnumerable ... поэтому любой массив в .NET (любого типа) реализует IEnumerable.

...