我有一个有趣的问题。根据MSDN收益率syntax:
yield return <expression>; // yield some value
yield break; // exiting from iterator
为什么不呢:
yield <expression>; // yield some value
return; // exiting from iterator
对我来说,第二种形式会更简洁,但仍然具有与第一种形式相同的含义。 所以问题是 - 为什么.NET设计者选择了第一种形式?可能是什么原因造成的?第二种形式有哪些潜在的设计问题?
答案 0 :(得分:5)
没有使用yield本身的主要原因是它会引入一个新关键字,并且在处理旧代码时可能会破坏向后兼容性。
正因为如此,C#语言团队决定将yield设为上下文关键字(在return
或break
后面只有一个关键字。)
请考虑以下代码:
yield variable;
yield可以是class
或struct
的名称,此语句可以是变量声明。
使用像C#这样易于编写和维护的复杂语言,您希望语句只有一个含义。如果return
做了不同的事情,取决于你是否在迭代器中,你可能会严重限制语言。
http://blogs.msdn.com/b/ericgu/archive/2006/03/08/546296.aspx
答案 1 :(得分:4)
这是一种可能性:它会产生技术歧义(请记住yield
是上下文关键字,而不是保留关键字)...不太可能,但是:
struct yield {}
然后
yield x;
实际上是变量声明。使用“yield return x;”,这只是一种有效的方式。
不知道这是不是真的。只是一个想法。
答案 2 :(得分:2)
return
语句具有单一含义,即必须返回方法返回类型的表达式。由于迭代器没有void
返回类型,因此使用return
语句退出迭代器并不符合这个含义,因为您没有“返回”任何内容。
yield break
表示迭代器应退出而不返回任何其他元素。恕我直言,这使得yield break
语句比为此目的使用return
语句更清晰。