3

我有一个有趣的问题。根据 MSDN yield语法

yield return <expression>; // yield some value
yield break;               // exiting from iterator

为什么不只是:

yield <expression>;        // yield some value
return;                    // exiting from iterator

对我来说,第二种形式会不那么冗长,并且仍然与第一种形式具有相同的含义。所以问题是 - 为什么 .NET 设计人员选择了第一种形式?什么原因可能导致这种情况?第二种形式有哪些潜在的设计问题?

4

3 回答 3

5

不使用 yield 本身的主要原因是它会引入一个新的关键字,并且在处理旧代码时可能会破坏向后兼容性。

正因为如此,C# 语言团队决定让 yield 成为一个上下文关键字(它只有在returnor之后才是一个关键字break)。

考虑以下代码:

yield variable;

yield 可以是 aclass或 a的名称,struct并且这个语句cold 是一个变量声明。

对于像 C# 这样易于编写和维护的复杂语言,您希望语句只有一个含义。如果return根据您是否在迭代器中做不同的事情,您可能会对语言有严重的限制。

http://blogs.msdn.com/b/ericgu/archive/2006/03/08/546296.aspx

于 2012-06-30T22:02:00.253 回答
4

这是一种可能性:它会产生技术上的歧义(请记住,这yield是一个上下文关键字,而不是保留关键字)......不太可能,但是:

struct yield {}

然后

yield x;

实际上是一个变量声明。使用“yield return x;”,这仅是一种有效的方式。

不知道这是否属实。只是一个想法。

于 2012-06-30T22:00:23.433 回答
2

return语句的唯一含义是它必须返回方法返回类型的表达式。由于迭代器没有void返回类型,使用语句退出迭代器return并不符合这个含义,因为您没有“返回”任何东西。

yield break指示迭代器应该退出而不返回任何更多元素。恕我直言,这使该声明比为此目的yield break使用该声明更清晰。return

于 2012-06-30T21:56:21.777 回答