2016-08-26 2 views
0

왜 나는 컴파일러 오류가 있는지 혼동합니다 CS0136 "로컬 또는 매개 변수를 정의하기 위해 해당 로컬 범위에서 해당 이름이 사용되므로이 범위에서 'a'라는 로컬 또는 매개 변수를 선언 할 수 없습니다 " 그런 종류의 루프에? 처음에는 이 루프 안쪽에 있습니까?루프의 로컬 범위 모순

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

     int a = 1; 
    } 

그렇지 않다면, 왜 컴파일러는 여기에 모순이 있는가 왜이 제한되어 그것이이 변형

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

     int b = 1; 
    } 

에를 선언하기 전에 오류 CS0841는 지역 변수 'B'를 사용할 수 없습니다 있습니다 에 대한?

+0

를 호출 할 종료 후에 만 ​​다음 루프 내

int a = b; 

를 호출하고있다 (묶으 그 안에'{} '). 나는'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을 처리하려고한다는 것입니다. 당신은 루프 당신이 다른 범위의 블록 내부에 A` 반드시 사용 '위해 할

int b = 1;