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