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

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

int i = 1;

{
   int i = 0;
}

int i = 1;

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

有帮助吗?

解决方案

C#语言规范的第3部分介绍了此行为。以下是规范

的引用
  

同样,任何表达方式   作为一个匿名的身体发生   功能的形式   lambda-expression创建了一个   声明空间包含   匿名函数的参数。   这是一个错误的两个成员   局部变量声明空间   有相同的名字。这是一个错误   局部变量声明空间   一个块和一个嵌套的局部变量   声明空间包含元素   同名。因此,在一个   嵌套的声明空间不是   可以声明一个局部变量   或者与a同名的常数   局部变量或常数   附上申报空间。

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

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

其他提示

我认为这是以这种方式完成的,因此内部作用域可以访问在外部作用域中声明的变量。如果允许覆盖外部作用域中存在的变量,则可能会混淆行为的意图。所以他们可能决定通过阻止它发生来解决问题。

我认为这是为了防止开发者在脚下射击。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top