我在 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
循环也是如此。
So i
与在外部声明的变量具有相同的作用域for
loop?
Edit:
需要明确的是,我使用的是 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 表达式中声明的变量的范围位于其后面的块的外部。不久前,这一点已被更改,因此 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# 不允许在嵌套作用域中存在同名变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)