1

参考代码

public void MyMethod()
{
    string x;
    List sampleList = populateList();

    foreach(MyType myType in sampleList)
    {
        string x;   // why is this not allowed?
        doSomethingwithX(x);
    }
}

我最近开始学习 C#,今天遇到了与上面类似的代码的问题。VS2010 用这条消息标记了注释代码a local variable named x cannot be declared in this scope because it would give a different meaning to variable x which is already used in parent or current scope to denote something else....

我不明白...不是块语句和范围界定的全部本质...我知道我可以更改我的变量名并继续。但我想知道为什么?

4

4 回答 4

3

我不明白...不是块语句和范围的全部本质...

不,不是。范围界定的目的不是“允许您重用名称”。

我知道我可以更改我的变量名并继续。但我想知道为什么?

基本上,它减少了混淆代码的可能性。在多种情况下,C# 会阻止您编写令人困惑的代码。当然,没有我们想要的那么多,但是如果允许某事没有明显的好处,而不允许它有明显的好处,那么禁止它是有道理的。

您是否使用两次在范围内具有相同局部变量名称的代码?您不是总是希望原始开发人员使用不同的名称吗?我会 - 所以我很高兴编译器强制执行。

请注意,这不会阻止在同一方法中使用相同的局部变量名称两次——它们只是不能在同一范围内。所以这是有效的:

public void Foo()
{
    {
        int x = 10;
        ...
    }

    {
        int x = 10;
        ...
    }
}

但这不是:

public void Foo()
{
    {
        int x = 10;
        ...
    }

    int x = 10;
    ...
}

如果第二个示例令人困惑,您需要记住,局部变量的范围是声明它的- 而不是从声明点开始。

于 2013-10-14T14:40:49.787 回答
2

先前定义x的仍在范围内,这就是编译器阻止您声明另一个的原因。

您可以通过将其包装在花括号中来限制先前变量的范围来验证这一点 -

  public void MyMethod()
  {
      {
        string x;
      }
      List sampleList = populateList();    
      foreach(MyType myType in sampleList)
      {
          string x;   // This will be fine.
          doSomethingwithX(x);
      }
   }
于 2013-10-14T14:41:00.770 回答
0

for 循环中的 x 在循环之外是不可见的,但您在方法开始时声明的 x 在 for 循环中是可见的。

在循环之外你有一个 x 但里面有两个,这两个都被声明了

于 2013-10-14T14:38:59.910 回答
0

你不能声明字符串 x; 再次。..它将有不同的含义。由于字符串 x; 在方法内部声明。x 的范围将在整个方法中可用。. 所以请为每个循环声明一些其他变量。..

或者你可以只是 x。而不是再次声明。.

于 2013-10-14T14:42:18.497 回答