下面的代码在 Visual Studio 2012 中产生了这个错误; “不能在此作用域中声明名为“x”的局部变量,因为它会给“x”赋予不同的含义,而“x”已经在“子”作用域中用于表示其他内容”
for (int x = 0; x < 9; x++)
{
//something
}
int x = 0;
但是。如下修改时出现此错误; “名称‘x’在当前上下文中不存在”
for (int x = 0; x < 9; x++)
{
//something
}
x = 0;
这是一个巨大的矛盾还是我遗漏了什么?
到目前为止,除了 Rik 之外,没有人指出正确答案。
再次仔细阅读错误信息。他们清楚地解释了错误。第一个错误是:
A local variable named 'x' cannot be declared in this scope because it would give a different meaning to 'x', which is already used in a 'child' scope to denote something else
实际上阅读错误信息。它说使用相同的名称表示两种不同的事物是非法的。该错误与外部 x
本身的范围无关;它与 x
在相同的外部范围 中用来表示两件事 这一事实有关。
正如 Rik 指出的那样,此规则的目的是避免开发人员对 x
的含义感到困惑。一个给定的名字在整个街区几乎总是意味着同样的事情。 (有一些微妙的异常(exception),但我们今天不讨论这些。)这条规则还有助于防止因在方法中重新排序语句而引入的错误,从而巧妙地改变名称的含义。如果名称的含义在 block 内不变,则可以放心地在该 block 内进行代码编辑。
许多答案都说范围不允许重叠。是的,他们是。 局部变量范围不允许重叠,但范围允许重叠。例如:
class C
{
int x;
void M()
{
int y = this.x;
for(int x = 0; x < 10; ++x) {}
}
}
即使在作用域中同时有两个名为 x
的东西也是完全合法的。但这是不合法的:
class C
{
int x;
void M()
{
int y = x; // Means this.x
for(int x = 0; x < 10; ++x) {} // means local x
}
}
现在简单的名称 x
在 M 的主体中表示两个不同的东西,那 是非法的。再次重申,确保您理解这一点:在同一范围内使用相同的名称来表示两个事物是非法的。重叠作用域不是非法的。
现在你的第二个错误:
"The name 'x' does not exist in the current context"
名称x
仅在for
语句中有效。 for
语句:
for (declarations ; condition ; increment ) body
在逻辑上等同于(模中断和继续行为)
{
declarations;
while(condition)
{
body
increment
}
}
注意外括号。该声明中的任何内容都可以在整个条件、主体或增量中使用,但不在范围之外。