无法进入返回IEnumerable <t>的方法?</t>

时间:2011-04-18 16:28:05

标签: c# visual-studio-2010

我有一个返回IEnumerable的方法..

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

  // more foreach logic
  yield return otherPages;

  // etc
}

这种方法在某种程度上似乎有效。但真正莫名其妙的是我无法介入它!我把调试器点全部放在一边,调试器只是通过它们!

有谁知道为什么会这样?

4 个答案:

答案 0 :(得分:34)

在枚举之前,该方法不会运行。

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

答案 1 :(得分:8)

正如其他人所指出的那样,迭代器块的主体在迭代器实际上被移动之前不会被执行。只是创建迭代器只会创建它。人们经常发现这令人困惑。

如果迭代器块的设计和实现对您感兴趣,这里有一些关于这个主题的好文章:

Raymond Chen :(基本要点简介)

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

Jon Skeet :(很长,很深)

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

Eric Lippert(我):(高级场景和角落案例)

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

答案 2 :(得分:5)

您的可枚举方法只会在您实际尝试访问成员后执行。

这称为“延期执行”(见http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx

尝试实际访问返回的IEnumerable,或者只是调用;

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

答案 3 :(得分:0)

尝试在收益率上休息一下。那应该解决它。