2011-08-05 5 views
5

가능한 중복은 :
confused with the scope in c#
C# Variable ScopingC# : for 루프의 초기화 부분에서 선언 된 변수의 범위 정의?

나는를위한 루프 (등)의 초기화 부분에서 선언 된 변수의 범위 뒤에 설계 고려 사항에 대해 궁금합니다. 이러한 변수는 범위를 벗어나거나 범위를 벗어난 것처럼 보이지 않거나 내가 누락 된 변수입니까? 왜 이것이 언제 필요합니까? 즉 :

for (int i = 0; i < 10; i++) 
{ 
} 

i = 12;  //CS0103: The name 'i' does not exist in the current context 

int i = 13; //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 

답변

3

루프 변수의 범위는 루프 자체입니다. 이것이 내가 루프 밖에서 사용할 수 없다는 예상 결과를 보는 이유입니다.

루프 밖에서 선언 할 수 없다는 사실은 좀 더 수수께끼가 없지만 일단 컴파일되면 모든 변수 선언은 선언 된 블록의 시작 부분에있는 것으로 간주 될 수 있습니다. 실제 코드는 다음과 같습니다.

int i; 

for (int i = 0; i < 10; i++) 
{ 
} 

i = 13; 

이름 충돌이 발생하기를 바랍니다. 왜 그런 식으로 작동하는지에 대해서는 확실히 말할 수 없습니다. 나는 컴파일러가 후드에서 어떤 일을하는지에 대해서는 잘 모르겠지만, 다른 누군가가 그 이유를 설명하고 설명하기를 바랍니다.

+0

크리스에게 감사드립니다. 위의 예는 분명히 이름 충돌을 발생시킵니다. 그것이 컴파일 된 방법을 보는다면 * 이해할 수 있습니다. +1하고 받아들입니다. –

0

디자인 고려 사항은 매우 간단합니다. 혼동을 피하기 위해서. 외부 변수 이름을 숨길 이유는 거의 없습니다. BTW를 순환시키는 것이 아니라 C#의 모든 내부/외부 범위에 적용됩니다.

1

i = 13이라고 선언하면 메소드의 범위가 있습니다. 그래서 그 메소드에서 이미 변수 i를 선언했고 for 루프의 범위에서 두 번째 선언이 중복 될 것입니다.

+0

범위가 Method 인 경우 수락하면 for 루프의 범위를 벗어나는 방법으로 참조 할 수 없습니까? i = 12로 설정하는 행을 주목하십시오. – giltanis