2012-04-02 111 views
3

可能重复:
C# Variable Scoping范围变量中,如果

我想如果在不同的范围内我可以声明两个变量具有相同的名称:

namespace IfScope 
{ 
    class Demo 
    { 
     public static void Main() 
     { 
      bool a = true; 

      if (a) 
      { 
       int i = 1; 
      } 
      string i = "s"; 
     } 
    } 
} 

编译器说别的:

$ csc Var.cs 
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1 
Copyright (C) Microsoft Corporation. All rights reserved. 

Var.cs(13,20): error CS0136: A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else 

这将意味着i声明里面,如果外面是可见的(这是我的理解)

但是,如果我尝试使用它,然后我得到这个。

$ cat Var.cs 
namespace IfScope 
{ 
    class Demo 
    { 
     public static void Main() 
     { 
      bool a = true; 

      if (a) 
      { 
       int i = 1; 
      } 
      i = "s"; 
     } 
    } 
} 

Var.cs(13,14): error CS0103: The name 'i' does not exist in the current context 

很明显,但是这里发生了什么?

+6

[1]:http://stackoverflow.com/questions/2049330/c-sharp-variable-scoping – Sandeep 2012-04-02 22:33:05

+0

是的,绝对重复 – 2012-04-02 22:34:16

+0

简短回答:一个局部变量在声明它的整个块的范围内。也就是说,它的范围包括声明前块的部分。请参阅规格的第3.7节(v 4.0)。范围因此不是分开的。 – phoog 2012-04-03 18:14:22

回答

3

C#要求简单的名称在首次使用它的所有块中都有一个含义。 From here.

从规格。

对于给定的标识符如在表达式或声明简单名称的每次出现时,即发生局部变量声明空间内,相同的标识符作为一个简单名称在表达每次其它出现时或声明者必须参考同一个实体。该规则确保名称的含义在给定块,开关块,for-,foreach或using语句或匿名函数中始终保持相同。

+0

不正确。贯穿所有使用它的块。但链接是正确的,并提供正确的例子。 – 2012-04-02 22:39:06

+0

@JirkaHanika谢谢指出。纠正。 – Sandeep 2012-04-02 22:40:26

-1

标识符i只在if中可见,但其范围是整个方法。这意味着我确定的变量在方法开始时立即生效。这是因为当时需要分配内存。在运行时不能在堆栈上分配内存的决定因此在条件块内部的所有变量都是在控制进入if之前创建的,并且该变量存在直到该方法返回。

+0

这是不正确的。你可以有两个单独的'if'块,每个块声明相同的变量。 – 2012-04-02 22:38:29

+0

@AndrewBarber如果在两个if语句中声明变量,编译器会真正声明一个变量并在两个作用域中使用它。说到在IL级别,变量名称是无关紧要的。所以理论上编译器可以允许使用相同的名称,但它只会鼓励编写令人困惑的代码。 – 2012-04-02 22:43:37

+0

@HananKhan你可以使用相同的名字,但不同的类型。他们真的不同。他们的范围是'如果',使这个答案错了​​。 – 2012-04-02 22:47:05