不能步进返回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
}

这个方法似乎有效…在某种程度上。但真正令人困惑的是,我无法踏入其中!我把调试器点放在周围,调试器只是通过他们!!

有人知道为什么会发生这种情况吗?

不能步进返回IEnumerable<T>的方法

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

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.aspx

Eric 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。这应该能解决问题。