我在 Visual Studio 2008 中收到以下错误:
错误 1 无法在此作用域中声明名为“i”的局部变量,因为它会给“i”赋予不同的含义,而“i”已在“子”作用域中用于表示其他内容
这是我的代码:
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)
最佳答案
我认为你们都混淆了 C++ 和 C#。
在 C++ 中,for 表达式中声明的变量的作用域通常在它后面的 block 之外。这在前一段时间被改变了,因此在 for 表达式中声明的变量的范围在它后面的 block 内部。 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# 不允许在嵌套作用域中具有相同名称的变量。
关于c# - for 循环中计数器变量的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3426782/