c# – 对于循环计数器变量范围似乎具有双重个性?

参见英文答案 > Variable scope confusion in C#4个
下面的代码在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的含义感到困惑的情况.给定的名称在整个块中几乎总是意味着相同的东西. (有一些细微的例外,但我们今天不要讨论它们.)这条规则还有助于防止在方法中重新排序语句引入的错误,从而巧妙地改变名称的含义.如果名称的含义在块内是不变的,则可以放心地在该块内编辑代码.

许多答案都说不允许范围重叠.对,他们是.不允许局部变量范围重叠,但允许范围重叠.例如:

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
    } 
}

注意外括号.该声明中的任何内容都可以在整个条件,正文或增量中使用,但不在范围之外.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...