7

受这个问题的启发,我开始想知道为什么以下示例在 c# 中都是非法的:

VoidFunction t = delegate { int i = 0; };

int i = 1;

{
   int i = 0;
}

int i = 1;

我只是想知道是否有人知道这种语言设计的确切原因?是为了阻止不良的编程实践,如果是这样,为什么不发出警告?出于性能原因(编译和运行时)还是原因是什么?

4

3 回答 3

9

C# 语言规范的第 3 节介绍了此行为。这是规范的报价

类似地,任何以 lambda 表达式形式作为匿名函数体出现的表达式都会创建一个包含匿名函数参数的声明空间。局部变量声明空间的两个成员具有相同名称是错误的。块的局部变量声明空间和嵌套的局部变量声明空间包含同名元素是错误的。因此,在嵌套的声明空间中,不可能声明与封闭声明空间中的局部变量或常量同名的局部变量或常量。

我认为更简单的阅读方式是,出于变量声明(以及许多其他与块相关的函数)的目的,lambda/匿名委托块的处理方式与普通块没有区别。

至于为什么以这种方式设计语言,规范没有明确说明。我的意见虽然是简单的。如果代码被视为只是另一个块,那么它会使代码分析例程更容易。您可以保留所有现有例程来分析块的语义错误和名称解析。当您考虑可变提升时,这一点尤其重要。Lambda 最终将成为一个不同的函数,但它们仍然可以在声明点访问所有范围内的变量。

于 2009-01-01T17:29:04.923 回答
2

我认为这样做是为了使内部范围可以访问在外部范围中声明的变量。如果允许您覆盖外部范围中存在的变量,则可能会混淆预期的行为。因此,他们可能已决定通过防止问题发生来解决问题。

于 2009-01-01T17:31:12.623 回答
0

我认为这是防止开发人员在脚下开枪的方式。

于 2009-01-01T18:07:50.600 回答