我在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
循环。
所以i
与for
循环之外声明的变量具有相同的范围?
修改
为了清楚起见,我正在使用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)
答案 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 = "";
}
我发现像这样思考会让我的心理模型中的答案“更合适”......