2016-08-26 36 views
0

我很困惑为什么会出现编译器错误CS0136“本地或名为'a'的参数不能在此作用域中声明,因为该名称在封闭的本地作用域中用于定义本地或参数“在那种循环? 是不是第一个a封闭在循环内?循环中的局部范围矛盾

 static void Main(string[] args) 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      int a = 0; 
     } 

     int a = 1; 
    } 

如果不是,为什么会出现编译错误CS0841不能使用局部变量“B”正是在这样的变型

static void Main(string[] args) 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      int a = b; 
     } 

     int b = 1; 
    } 

宣布之前有没有在这里任何矛盾,这是为什么限制由对于?

+0

你可以肯定地使用'另一个作用域块内只了'后(附上这里面'{} ')。我有时候这样做是为了避免命名不同的东西,比如'item'。 – Sinatr

+0

@Sinatr我也发现了,谢谢。 –

回答

0

在你的第一个函数中,函数本身是一个变量作用域。正如Sinatr提到的,你可以声明一个封闭范围,但是这个范围不能和一般函数的范围相抵触。正如John Skeet(Why can't a duplicate variable name be declared in a nested local scope?)所述,您的问题是编译器认为您试图在子范围内声明新的a实际上是非法尝试引用尚未声明的父项a

在第二个函数中,不同之处在于您在声明变量之前试图对变量b进行寻址。要调用

int a = b; 

一个循环中,然后循环结束你叫

int b = 1;