C#:在for循环的初始化部分声明的变量范围的定义?

C#:在for循环的初始化部分声明的变量范围的定义?,c#,scope,C#,Scope,可能的重复项: 我对for循环(etc)初始化部分声明的变量范围背后的设计考虑很好奇。这些变量似乎既不在范围内也不在范围外,或者我遗漏了什么?为什么要这样做?什么时候需要这样做?即: for (int i = 0; i < 10; i++) { } i = 12; //CS0103: The name 'i' does not exist in the current context int i = 13; //CS0136: A local variable na

可能的重复项:

我对for循环(etc)初始化部分声明的变量范围背后的设计考虑很好奇。这些变量似乎既不在范围内也不在范围外,或者我遗漏了什么?为什么要这样做?什么时候需要这样做?即:

for (int i = 0; i < 10; i++)
{
}

i = 12;       //CS0103: The name 'i' does not exist in the current context

int i = 13;   //CS0136: A local variable named 'i' cannot be declared in this scope 
              //because it would give a different meaning to 'i', which is already 
              //used in a 'child' scope to denote something else
for(int i=0;i<10;i++)
{
}
i=12//CS0103:名称“i”在当前上下文中不存在
int i=13//CS0136:无法在此作用域中声明名为“i”的局部变量
//因为它会给“我”一个不同的含义,它已经是
//在“child”范围中用于表示其他内容

循环变量的作用域是循环本身。这就是为什么您会看到i在循环之外不可用的预期结果

不能在循环外声明i的事实有点让人费解,但这是因为一旦编译了所有变量声明,就可以认为它们位于声明它们的块的开头。也就是说,您的代码实际上与以下代码相同:

int i;

for (int i = 0; i < 10; i++)
{
}

i = 13; 
inti;
对于(int i=0;i<10;i++)
{
}
i=13;

希望这里很明显你有一个名字冲突。至于为什么会这样,我不能肯定地告诉你。我不太清楚编译器在幕后做什么,但希望其他人会站出来解释原因。

设计考虑非常简单:避免混淆。几乎没有任何理由允许隐藏外部变量名。顺便说一句,这条规则不仅适用于循环,还适用于C#中的任何内部/外部作用域。

当您声明i=13时,它有一个方法作用域。因此,在该方法中,您已经声明了变量i,并且for循环范围中的第二个声明将是重复的。

Accept如果它有一个方法范围,那么您不能在for循环范围之外引用它吗?注意设置i=12的行。谢谢你回答克里斯。上面的例子很明显会导致名称冲突。如果这就是编译人员的看法,那么这是可以理解的+1并接受。