Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法进入返回IEnumerable的方法<;T>;?_C#_Visual Studio 2010 - Fatal编程技术网

C# 无法进入返回IEnumerable的方法<;T>;?

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逻辑 返回其他页面;

我有一个返回IEnumerable的方法,如下所示

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,谢谢。我正在添加一些资源,但电池没电了。请注意,这可能是您收到“跳过非用户代码”消息的原因,该消息似乎没有任何意义。在查找字符串时,我花了一些时间才找到这个问题。