C#局部变量范围

时间:2012-08-21 18:19:23

标签: c#

  

可能重复:
  confused with the scope in c#

在C#中,使用if / else / loop块的本地范围定义的变量与该块之后定义的外部变量冲突 - 请参阅代码剪切。在C / C ++和Java下,等效代码编译得很好。这是C#中的预期行为吗?

public void f(){
  if (true) {
    /* local if scope */
    int a = 1;
    System.Console.WriteLine(a);
  } else {
    /* does not conflict with local from the same if/else */
    int a = 2;
    System.Console.WriteLine(a);
  }

  if (true) {
    /* does not conflict with local from the different if */
    int a = 3;
    System.Console.WriteLine(a);
  }

  /* doing this:
   * int a = 5;
   * results in: Error 1 A local variable named 'a' cannot be declared in this scope
   *  because it would give a different meaning to 'a', which is already used in a 
   *  'child' scope to denote something else
   * Which suggests (IMHO incorrectly) that variable 'a' is visible in this scope
   */

  /* doing this: 
   * System.Console.WriteLine(a);
   * results in: Error 1 The name 'a' does not exist in the current context..
   * Which correctly indicates that variable 'a' is not visible in this scope
   */
}

5 个答案:

答案 0 :(得分:5)

是的,这就是C#的工作原理。

声明范围时,外部范围内的任何局部变量也是已知的 - 没有办法确定范围内的局部变量应该从外部覆盖局部变量。

答案 1 :(得分:4)

您似乎关注声明的顺序(在<{em> a块之后重新声明if )。

考虑在 if块之前声明的情况。那么你会期望它在这些块的范围内可用。

int a = 1;

if(true)
{
  var b = a + 1; // accessing a from outer scope
  int a = 2; // conflicts
}

在编译时,实际上并没有“不在范围内”的概念。

您实际上可以使用裸花括号创建内部范围:

{
   int a = 1;
}

if(true)
{
   int a = 2; // works because the a above is not accessible in this scope
}

答案 2 :(得分:3)

这是正常行为。

Sam Ng刚才写了一篇很好的博客文章:http://blogs.msdn.com/b/samng/archive/2007/11/09/local-variable-scoping-in-c.aspx

答案 3 :(得分:2)

已经有一些很好的答案,但我看了一下C#4语言规范以澄清这一点。

我们可以在§1.24中读到范围:

  

范围可以嵌套,内部范围可以重新声明a的含义   来自外部范围的名称(但是,这不会删除   §1.20强加的限制,在嵌套块内它不是   可以声明一个与本地同名的局部变量   封闭区块中的变量。)

这是§1.20中引用的部分:

  

声明在声明空间中定义了一个名称   声明属于。除了重载成员(§1.23),它是一个   编译时错误,有两个或多个引入的声明   声明空间中具有相同名称的成员。永远不会   声明空间可能包含不同类型的成员   同名

     

[...]

     

请注意,在函数成员的主体内部或内部发生的块   或匿名函数嵌套在局部变量声明中   这些函数为其参数声明的空间。

答案 4 :(得分:0)

是。这是预期的,因为您在本地语句中定义变量。如果要在类级别定义变量,则会得到不同的结果。