题
受到问题的启发,我开始想知道为什么以下示例都是在c#中是非法的:
VoidFunction t = delegate { int i = 0; };
int i = 1;
和
{
int i = 0;
}
int i = 1;
我只是想知道是否有人知道这种语言设计的确切原因?它是否会阻止糟糕的编程实践,如果是这样,为什么不发出警告?,出于性能原因(编译和运行时)或者是什么原因?
解决方案
C#语言规范的第3部分介绍了此行为。以下是规范
的引用同样,任何表达方式 作为一个匿名的身体发生 功能的形式 lambda-expression创建了一个 声明空间包含 匿名函数的参数。 这是一个错误的两个成员 局部变量声明空间 有相同的名字。这是一个错误 局部变量声明空间 一个块和一个嵌套的局部变量 声明空间包含元素 同名。因此,在一个 嵌套的声明空间不是 可以声明一个局部变量 或者与a同名的常数 局部变量或常数 附上申报空间。
我认为更简单的方法是,为了变量声明(以及许多其他与块相关的函数),lambda / anonymous委托块的处理方式与普通块没有区别。
至于为什么语言是这样设计的,规范没有明确说明。我的意见是简单。如果代码被视为另一个块,那么它使代码分析例程更容易。您可以保留所有现有例程,以分析块的语义错误和名称解析。考虑变量提升时,这一点尤为重要。 Lambda最终将是一个不同的函数,但它们仍然可以在声明点访问所有范围变量。
其他提示
我认为这是以这种方式完成的,因此内部作用域可以访问在外部作用域中声明的变量。如果允许覆盖外部作用域中存在的变量,则可能会混淆行为的意图。所以他们可能决定通过阻止它发生来解决问题。
我认为这是为了防止开发者在脚下射击。
不隶属于 StackOverflow