На данный вопрос уже ответили:
Работа цикла foreach, С#
1 ответ
Я реализовал простенький односвязный список сначало так :
Клас, производный от интерфейса IEnumerable
class MyList
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Затем его переписал его так, что бы он не был производным от интерфейса IEnumerable
class MyList
На MDSN написано :
The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the IEnumerable or IEnumerable interface.
Второй класс не является производным от IEnumerable. Каким образом я тогда могу спокойно по нему пройтись оператором foreach()?
MyList
Ответ
Открываем документацию и читаем:
Оператор foreach выполняет оператор или блок операторов для каждого элемента в экземпляре типа, который реализует интерфейс System.Collections.IEnumerable или System.Collections.Generic.IEnumerable
Таким образом, достаточно просто наличия подходящего метода GetEnumerator
Спецификация уточняет, что вот такой foreach
foreach (V v in x) embedded_statement
на этапе компиляции раскрывается в
{
E e = ((C)(x)).GetEnumerator();
try {
while (e.MoveNext()) {
V v = (V)(T)e.Current;
embedded_statement
}
}
finally {
... // Dispose e
}
}
(C — тип коллекции, E — тип энумератора, V — тип значения элемента коллекции.) [Таким образом, всё происходит на этапе компиляции, рефлексия не применяется.]
Комментариев нет:
Отправить комментарий