下面的代码在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;
这是一个巨大的矛盾还是我错过了什么?
解决方法
非常仔细地再次阅读错误消息.他们清楚地解释了错误.第一个错误是:
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的含义感到困惑的情况.给定的名称在整个块中几乎总是意味着相同的东西. (有一些细微的例外,但我们今天不要讨论它们.)这条规则还有助于防止在方法中重新排序语句引入的错误,从而巧妙地改变名称的含义.如果名称的含义在块内是不变的,则可以放心地在该块内编辑代码.
许多答案都说不允许范围重叠.对,他们是.不允许局部变量范围重叠,但允许范围重叠.例如:
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语句中有效. A声明:
for (declarations ; condition ; increment ) body
在逻辑上是等价的(模数中断和继续行为)
{ declarations; while(condition) { body increment } }
注意外括号.该声明中的任何内容都可以在整个条件,正文或增量中使用,但不在范围之外.