Не можете войти в метод, возвращающий IEnumerable <T>? - PullRequest
23 голосов
/ 18 апреля 2011

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

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

  // more foreach logic
  yield return otherPages;

  // etc
}

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

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

Ответы [ 4 ]

34 голосов
/ 18 апреля 2011

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

foo.ToPages().ToList() // will enumerate and your breakpoint will be hit.
8 голосов
/ 18 апреля 2011

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

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

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

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/

5 голосов
/ 18 апреля 2011

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

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

Попробуйте на самом деледоступ к IEnumerable, который возвращается, или просто вызов;

var p = obj.ToPages().ToList();
0 голосов
/ 18 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...