为什么if和#的范围以这种方式在c#中

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

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

 { int i = 0; } int i = 1; 

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

C#语言规范的第3节中介绍了此行为。 这是规范的引用

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

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

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

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

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