2016-08-26 19 views
0

コンパイルエラーが発生する理由が混乱していますCS0136 "ローカルまたはパラメータを定義するためにその名前が囲まれたローカルスコープで使用されているため、このスコープでは宣言できません"その種のループの? ループ内に最初にが入っていませんか?ループ内のローカルスコープの矛盾

 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を参照する違法な試みであるとコンパイラが判断したことです。

第2の関数では、変数が宣言される前に変数bに対処しようとしているという違いがあります。あなたは、ループ内で

int a = b; 

を呼び出し、その後、ループが終了した後にのみ、あなたが(内部で囲み、 `{}あなたは別の内部必ず使用` A`ためにブロックをスコープでき

int b = 1;