到目前为止,除了 Rik 之外,没有人指出正确的答案。
再次仔细阅读错误消息。他们清楚地解释了错误。第一个错误是:
不能在此范围内声明名为“x”的局部变量,因为它会给“x”赋予不同的含义,后者已在“子”范围内用于表示其他内容
实际上阅读错误信息。它说用同一个名字来表示两个不同的东西是违法的。该错误与外部x 本身的范围无关;这与x 在相同的外部范围中用于表示两件事这一事实有关。
正如 Rik 所指出的,这条规则的目的是避免开发人员对x 的含义感到困惑的情况。一个给定的名称在整个块中几乎总是意味着相同的东西。 (有一些微妙的例外,但我们今天不讨论这些例外。)这条规则还有助于防止由于在方法中重新排序语句而引入的错误,从而巧妙地改变名称的含义。如果名称的含义在一个块中是不变的,则可以放心地在该块中进行代码编辑。
许多答案说范围不允许重叠。是的,他们是。 局部变量范围不允许重叠,但范围允许重叠。例如:
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 体内的两个不同的东西,而那 是非法的。同样,请确保您理解这一点:在同一范围内使用相同的名称表示两个事物是非法的。重叠范围不是非法的。
现在你的第二个错误:
“当前上下文中不存在名称‘x’”
名称x 仅在for 语句中有效。 for 声明:
for (declarations ; condition ; increment ) body
在逻辑上等价于(模中断和继续行为)
{
declarations;
while(condition)
{
body
increment
}
}
注意外面的大括号。该声明中的任何内容都可以在整个条件、正文或增量中使用,但不在外部范围内。