首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么“返回”和“收益返回”不能在同一个方法中使用呢?

为什么“返回”和“收益返回”不能在同一个方法中使用呢?
EN

Stack Overflow用户
提问于 2012-03-09 16:51:18
回答 3查看 7K关注 0票数 25

为什么我们不能在同一个方法中同时使用收益和收益呢?

例如,我们可以在下面使用GetIntegers1和GetIntegers2,但不能使用GetIntegers3。

public IEnumerable<int> GetIntegers1()
{
  return new[] { 4, 5, 6 };
}

public IEnumerable<int> GetIntegers2()
{
  yield return 1;
  yield return 2;
  yield return 3;
}

public IEnumerable<int> GetIntegers3()
{
  if ( someCondition )
  {
    return new[] {4, 5, 6}; // compiler error
  }
  else
  {
    yield return 1;
    yield return 2;
    yield return 3;
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-09 16:55:13

return迫不及待。它一次返回整个结果集。yield return构建了一个枚举器。当您使用yield return时,C#编译器会在幕后发出枚举器所需的类。编译器在确定是否应该发出可枚举的代码或具有返回简单数组的方法时,不会查找运行时条件,如if ( someCondition )。它检测到您的方法中同时使用了这两种方法,这是不可能的,因为他不能发出枚举数的代码,同时让方法返回一个普通的数组,而这一切都是为了同一个方法。

票数 21
EN

Stack Overflow用户

发布于 2012-03-09 16:59:12

编译器使用yield语句(return或break)重写任何方法。它目前不能处理可能是yield的方法,也可能不是。

我推荐阅读Jon Skeet的C# in Depth的第6章,其中第6章是免费的-它很好地涵盖了迭代器块。

但是,我看不出在c#编译器的未来版本中为什么不能做到这一点。其他.Net语言也支持类似形式的“来自”运算符(See F# yield!)。如果c#中存在这样的运算符,它将允许您以以下形式编写代码:

public IEnumerable<int> GetIntegers()
{
  if ( someCondition )
  {
    yield! return new[] {4, 5, 6};
  }
  else
  {
    yield return 1;
    yield return 2;
    yield return 3;
  }
}
票数 8
EN

Stack Overflow用户

发布于 2012-03-09 18:16:47

我认为它不能工作的主要原因是,以一种不太复杂但同时又具有高性能的方式来设计它将是困难的,相对来说好处很少。

你的代码到底会做什么呢?它是直接返回数组,还是迭代数组?

如果它会直接返回数组,那么您将不得不想出复杂的规则,在什么条件下允许return,因为yield return之后的return没有意义。您可能需要生成复杂的代码来决定该方法是返回自定义迭代器还是返回数组。

如果你想迭代这个集合,你可能需要一些更好的关键字。Something like yield foreach。这实际上是考虑过的,但最终没有实现。我想我记得我读过的主要原因是,如果你有几个嵌套的迭代器,实际上很难让它很好地执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9631209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档