不能步进返回IEnumerable的方法
本文关键字:方法 步进 返回 IEnumerable 不能 | 更新日期: 2023-09-27 17:50:41
我有一个方法,返回一个IEnumerable ..
public virtual IEnumerable<Page> ToPages(){
// foreach logic
yield return pages;
// more foreach logic
yield return otherPages;
// etc
}
这个方法似乎有效…在某种程度上。但真正令人困惑的是,我无法踏入其中!我把调试器点放在周围,调试器只是通过他们!!
有人知道为什么会发生这种情况吗?
方法在枚举之前不会运行。
foo.ToPages().ToList() // will enumerate and your breakpoint will be hit.
正如其他人所注意到的,迭代器块体在实际移动之前不会执行。仅仅创建迭代器除了创建迭代器之外没有其他作用。人们常常感到困惑。
如果您对迭代器块的设计和实现感兴趣,这里有一些关于这个主题的好文章:
陈雷蒙:(简短介绍基本要点)
- https://devblogs.microsoft.com/oldnewthing/20080812-00/?p=21273
- https://devblogs.microsoft.com/oldnewthing/20080813-00/?p=21253
- https://devblogs.microsoft.com/oldnewthing/20080814-00/?p=21243
Jon Skeet:(long, in depth)
http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspxEric Lippert(我):(高级场景和极端情况)
http://blogs.msdn.com/b/ericlippert/archive/tags/iterators/你的enumerable方法只有在你真正尝试访问成员时才会执行。
这被称为"延迟执行"(参见http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx)
尝试实际访问返回的IEnumerable,或者直接调用;
var p = obj.ToPages().ToList();
试着在yield上放一个break。这应该能解决问题。