关于c#:无法进入返回IEnumerable的方法

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();

试着在产量上稍作休息。这应该能解决问题。