C# 无法进入返回IEnumerable的方法<;T>;?
我有一个返回IEnumerable的方法,如下所示C# 无法进入返回IEnumerable的方法<;T>;?,c#,visual-studio-2010,C#,Visual Studio 2010,我有一个返回IEnumerable的方法,如下所示 public virtual IEnumerable<Page> ToPages(){ // foreach logic yield return pages; // more foreach logic yield return otherPages; // etc } 公共虚拟IEnumerable ToPages(){ //foreach逻辑 产生返回页面; //更多foreach逻辑 返回其他页面;
public virtual IEnumerable<Page> ToPages(){
// foreach logic
yield return pages;
// more foreach logic
yield return otherPages;
// etc
}
公共虚拟IEnumerable ToPages(){
//foreach逻辑
产生返回页面;
//更多foreach逻辑
返回其他页面;
//等
}
这个方法似乎有效。。。在某种程度上但真正令人困惑的是,我无法介入其中!我把调试器点放在四周,调试器正好穿过它们
有人知道为什么会发生这种情况吗?试着让收益率下降。这应该可以解决问题。该方法在您枚举到它之前不会运行
foo.ToPages().ToList() // will enumerate and your breakpoint will be hit.
只有在您实际尝试访问成员时,您的可枚举方法才会执行 这称为“延迟执行”(请参阅) 尝试实际访问返回的IEnumerable,或者只是调用
var p = obj.ToPages().ToList();
正如其他人所指出的,迭代器块的主体在迭代器实际移动之前不会执行。仅仅创建迭代器除了创建迭代器外,什么也不做。人们常常感到困惑 如果您对迭代器块的设计和实现感兴趣,下面是一些关于该主题的好文章: 陈雷蒙:(简要介绍基本要点) 乔恩·斯凯特:(长,深入) Eric Lippert(me):(高级场景和角落案例)
你是什么意思?我在整个方法中的每一行上都设置了断点,但它仍然没有进入其中。“屈服”是函数返回的点,它应该在该点上中断。它应该,是的。但事实并非如此。收益率是调用MoveNext返回的点。如果没有调用MoveNext,则显然不会命中其中的断点。这是一个可靠的答案。IEnumerable始终意味着延迟执行。这是使用IEnumerable和列表之间的核心区别之一。IEnumerable风格只会在时机成熟时返回迭代指令。列表将实际遍历集合并立即生成结果。这很有效。。。但这也就太奇怪了。它为什么会这样?@Ciel:我将发布一些文章链接,解释它为什么会这样工作。@Eric Lippert,谢谢。我正在添加一些资源,但电池没电了。请注意,这可能是您收到“跳过非用户代码”消息的原因,该消息似乎没有任何意义。在查找字符串时,我花了一些时间才找到这个问题。