for循环中计数器变量的范围是多少?

时间:2010-08-06 18:47:13

标签: c# c scope

我在Visual Studio 2008中收到以下错误:

Error 1 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 < 3; i++)
{
  string str = "";
}

int i = 0; // scope error
string str = ""; // no scope error

我理解,一旦循环终止,str就不再存在,但我也认为i的范围也仅限于for循环。

所以ifor循环之外声明的变量具有相同的范围?

修改

为了清楚起见,我正在使用C#。我正在辩论删除“C”标签。但是,由于正确的答案解释了两者之间的差异,我认为保留两个标签是有意义的。

我的代码评论中出现错误:

for (int i = 0; i < 3; i++)
{
  string str = "";
}

int i = 0; // scope error
string str = ""; // also scope error,
                 // because it's equivalent to declaring
                 // string str =""; before the for loop (see below)

4 个答案:

答案 0 :(得分:20)

我认为你们都在混淆C ++和C#。

在C ++中,曾经是for表达式中声明的变量的范围是在其后面的块的外部。这在一段时间之前已经改变,因此在for表达式中声明的变量的范围是在其后面的块的内部。 C#遵循以后的方法。但这与此无关。

这里发生的是C#不允许一个作用域隐藏外部作用域中具有相同名称的变量。

所以,在C ++中,这曾经是非法的。现在这是合法的。

for (int i; ; )
{
}
for (int i; ; )
{
}

同样的事情在C#中是合法的。有三个范围,其中'i'未定义的外部,以及两个子范围,每个范围都声明自己的'i'。

但你正在做的是:

int i;
for (int i; ; )
{
}

这里有两个范围。一个外部声明一个'i',一个内部也声明一个'i'。这在C ++中是合法的 - 外部'i'是隐藏的 - 但它在C#中是非法的,无论内部范围是for循环,while循环还是其他。

试试这个:

int i;
while (true)
{
    int i;
}

这是同样的问题。 C#不允许在嵌套作用域中使用相同名称的变量。

答案 1 :(得分:3)

for循环后,增量器不存在。

for (int i = 0; i < 10; i++) { }
int b = i; // this complains i doesn't exist
int i = 0; // this complains i would change a child scope version because the for's {} is a child scope of current scope

你不能在for循环之后重新声明i的原因是因为在IL中它实际上会在for循环之前声明它,因为声明发生在范围的顶部。

答案 2 :(得分:2)

是的。语法:新范围位于由卷曲字符串定义的块内。功能:在某些情况下,您可能需要检查循环变量的最终值(例如,如果中断)。

答案 3 :(得分:2)

只是一些背景信息:序列没有进入它。只有范围的想法 - 方法范围,然后是for循环的范围。因此,“一旦循环终止”就不准确了。

您的发布因此读取与此相同:

int i = 0; // scope error
string str = ""; // no scope error

for (int i = 0; i < 3; i++)
{
  string str = "";
}

我发现像这样思考会让我的心理模型中的答案“更合适”......