c# - for 循环计数器变量作用域似乎具有双重人格?

标签 c# scope

<分区>

下面的代码在 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
    } 
}

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

关于c# - for 循环计数器变量作用域似乎具有双重人格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21005204/

相关文章:

c# - 在 Orchard CMS 中使用 Document.cshtml 的替代品

c# - 将循环的所有结果存储在一个字符串中

c# - 模式验证在验证之前不修剪字符串

c++ - gdb 函数从本地范围调用 std::vector 导致错误

c# - 使用 Moq 测试对不同类的调用

c# - 如何获得最近的日期?

javascript - HTML 输入总是返回 0

c++ - 我如何搜索这个问题(范围内的宏与内联函数)

Python 全局命名空间值

javascript - 在 iOS 的 UIAutomation UIATarget.onAlert 中处理自定义 javascript 异常