为什么不能在嵌套的本地范围中声明重复的变量名?

Adu*_*cci 50 .net c#

根据最近的这个问题,我不明白提供的答案.看起来你应该可以做这样的事情,因为它们的范围不重叠

static void Main()
{
  {
    int i;
  }
  int i;
}
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,并出现以下错误:

名为"i"的局部变量不能在此范围内声明,因为它会给"i"赋予不同的含义,"i"已在"子"范围内用于表示其他内容

Jon*_*eet 38

我不认为任何的答案至今已相当得到了规范的关键线.

从8.5.1节:

local-variable-declaration中声明的局部变量的范围是声明发生的块.在局部变量的local-variable-declarator之前的文本位置引用局部变量是错误的.在局部变量的范围内,声明另一个具有相同名称的局部变量或常量是编译时错误.

(强调我的.)

换句话说,"稍后"变量的范围包括声明之前的块的一部分- 即它包括包含"早期"变量的"内部"块.

您不能在比其声明更早的位置引用后面的变量 - 但它仍然在范围内.


Teo*_*gul 8

"本地或常量变量的范围扩展到当前块的末尾.您不能在当前块或任何嵌套块中声明具有相同名称的另一个局部变量." C#3.0 in Nutshell,http://www.amazon.com/3-0-Nutshell-Desktop-Reference-OReilly/dp/0596527578/

"块的局部变量声明空间包括任何嵌套块.因此,在嵌套块中,不可能声明一个与封闭块中的局部变量同名的局部变量." Variable Scopes,MSDN,http://msdn.microsoft.com/en-us/library/aa691107%28v=vs.71%29.aspx

另外,这与JavaScript和F#范围规则完全相反.


Sea*_*n U 6

C#语言规范:

块的局部变量声明空间包括任何嵌套块.因此,在嵌套块中,不可能声明一个与封闭块中的局部变量同名的局部变量.

从本质上讲,它是不允许的,因为在C#中,它们的范围实际上是重叠的.

编辑:为了澄清一下,C#的范围是在块级别解决的,而不是逐行解决的.因此,虽然您不能在声明之前引用代码中的变量,但它的范围一直延伸到块的开头也是如此.