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

本文关键字:声明 变量 定义 范围 初始化部 for 循环 | 更新日期: 2023-09-27 18:04:48

可能的重复:
与c#
中的作用域混淆C#变量范围

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

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

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

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

事实上,你不能在循环外声明i,这有点令人困惑,但这是因为一旦编译,所有变量声明都可以被认为是在块的开头。这就是你的代码在实践中与相同

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

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

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

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