Не удается войти в метод, возвращающий IEnumerable <T>?

У меня есть метод, который возвращает IEnumerable, как это.

public virtual IEnumerable<Page> ToPages(){
  // foreach logic
  yield return pages;

  // more foreach logic
  yield return otherPages;

  // etc
}

Метод, похоже, работает... в некотором роде. Но что действительно озадачивает то, что я не могу войти в это! Я помещаю точки отладчика повсюду, и отладчик просто проходит через них!

Кто-нибудь знает, почему это может произойти?

Ответы

Ответ 1

Метод не запускается до тех пор, пока вы не перечислите его.

foo.ToPages().ToList() // will enumerate and your breakpoint will be hit.

Ответ 2

Как отмечали другие, тело блока итератора не выполняется до тех пор, пока итератор не будет перемещен. Простое создание итератора не делает ничего, кроме его создания. Люди часто находят это запутанным.

Если дизайн и реализация блоков итераторов вас интересует, вот несколько хороших статей по теме:

Раймонд Чен: (краткое введение в основные моменты)

http://blogs.msdn.com/b/oldnewthing/archive/2008/08/12/8849519.aspx

http://blogs.msdn.com/b/oldnewthing/archive/2008/08/13/8854601.aspx

http://blogs.msdn.com/b/oldnewthing/archive/2008/08/14/8862242.aspx

Джон Скит: (долго, подробно)

http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx

Эрик Липперт (я): (расширенные сценарии и угловые случаи)

http://blogs.msdn.com/b/ericlippert/archive/tags/iterators/

Ответ 3

Ваш перечислимый метод будет выполняться только после того, как вы попытаетесь получить доступ к членам.

Это называется " Отложенное выполнение" (см. http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx)

Попробуйте фактически получить доступ к возвращаемому IEnumerable или просто вызвать

var p = obj.ToPages().ToList();

Ответ 4

Попробуйте поставить разрыв на выходе. Это должно исправить это.