5

才发现

foreach (int yield in items) {
  yield return yield * 2;
}

或者

int yield = 10; 

是 C# 中的有效代码。

我可以理解编译器很容易区分变量 yield 和迭代器 yield,但它仍然增加了混乱并降低了代码的可读性。

我们知道允许它的确切原因吗?

4

2 回答 2

18

我们知道允许它的确切原因吗?

是的。yield只是一个上下文关键字。它是在 C# 2 中引入的,团队不想破坏已经用作yield标识符的代码。

从 1.0 开始引入的其他上下文关键字也是如此,例如partial. 有关完整列表,请参阅Eric Lippert 的博客文章

但它仍然增加了混乱并降低了代码的可读性

所以不要那样做?你可以做很多事情来让你的代码变得非常非常难以阅读。您可以将所有变量名都设为下划线:

private int _;
private string __;
// etc

你这样做吗?如果不是,您为什么希望人们yield专门编写令人困惑的代码?

于 2013-03-22T17:12:23.890 回答
2

yield是一个上下文关键字。它可能是一个普通的关键字,但他们选择将其设为上下文关键字。

上下文关键字的主要原因是向后兼容性。如果他们在语言中添加了普通关键字,则可能会破坏从旧版本语言复制的代码。

例如,想象一下在yield添加为普通关键字之后编译此代码:

bool yield = false;
// bla bla

它不会很好地工作,不是吗?您必须先重命名变量,然后才能使用较新的版本对其进行编译。

于 2013-03-22T17:13:48.590 回答