Cannot step into a method returning IEnumerable<T>?
我有一个方法返回这样的IEnumerable。
1 2 3 4 5 6 7 8 9 | 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. |
正如其他人所指出的,迭代器块的主体在迭代器实际移动之前不会执行。只创建迭代器只会创建它。人们常常觉得这令人困惑。
如果迭代器的设计和实现阻碍了您的兴趣,那么下面是一些关于这个主题的好文章:
陈瑞蒙:(基本要点简介)
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/ericlippet/archive/tags/iterators/
只有在实际尝试访问成员时,才能执行可枚举方法。
这被称为"延迟执行"(请参阅http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx)
尝试实际访问返回的IEnumerable,或者只调用它;
1 | var p = obj.ToPages().ToList(); |
试着在产量上稍作休息。这应该能解决问题。