2017-02-03 6 views
0

나는 이해하지 못하고 답을 찾을 수없는 몇 가지 이상한 행동을 발견했습니다. 나에게변수의 범위가 범위를 벗어났습니다

private void SomeMethod(BaseClass obj) 
{ 
    if (obj.GetType() == typeof(SubClass1)) 
    { 
     var variable = (SubClass1) obj; 
    } 

    else if (obj.GetType() == typeof(SubClass2)) 
    { 
     var variable = (SubClass2) obj; 
    } 
} 

variable의 두 선언이 다른 범위에있는 것 같다 그 var이의 실제 유형에 따라 SubClass1 또는 SubClass2 중 하나 될 것입니다 : BaseClassSubClass1SubClass2되는 서브 클래스로 나는 방법을 메서드에 obj이 전송되었습니다.

그러나이 메서드를 SubClass2 형식의 개체로 호출하면 else 절의 BaseClass에서 SubClass2까지의 형 변환이 항상 null을 반환합니다.

나는 내가 variable 선언의에 도달하기 전에, 즉 방법을 입력하는 즉시, variable가 ofcource가 null obj 반환의 캐스팅 이유를하다 타입 SubClass1의 것을 볼 코드를 디버깅

.

누구든지 왜 variable에 선언되기 전에 유형이 있는지 말해 줄 수 있습니까?

+0

'그러나이 메소드를 SubClass2 유형의 객체로 호출하면 else 절의 BaseClass에서 SubClass2로 캐스트하면 항상 null이 반환됩니다. '불가능합니다. 그 상황에서 결코 "null"이 될 수 없다. – Servy

+3

코드가 아니라 디버거 동작입니다. 이들은 서로 다른 범위에있는 서로 다른 유형의 두 개의 개별 변수입니다. 귀하의 코드는 컴파일되지 않았을 것입니다. 다른 일이 벌어지고있다. – dasblinkenlight

+0

@Igor 형식을 먼저 확인하면 코드를 캐스팅하지 못할 수 있습니다. – Servy

답변

3

는 나에게 variable의 두 선언이 다른 범위에있는 것 같다 그 var는 방법으로 전송 obj의 실제 유형에 따라 SubClass1 또는 SubClass2 중 하나 될 것입니다.

사실이 아닙니다. 두 개의 변수가 있습니다. 하나는 SubClass1이고 다른 하나는 SubClass2이고 다른 하나는 동일한 이름입니다. 변수의 유형은 런타임이 아닌 컴파일 타임에 결정됩니다. 코드는 동일 작성하는 데에 있습니다 :

private void SomeMethod(BaseClass obj) 
{ 
    if (obj.GetType() == typeof(SubClass1)) 
    { 
     SubClass1 variable = (SubClass1) obj; 
    } 

    else if (obj.GetType() == typeof(SubClass2)) 
    { 
     SubClass2 variable = (SubClass2) obj; 
    } 
} 

코드는 단순히이 코드에 대한 문법 설탕이다; 변수의 타입을 타이핑 할 필요가 없으며 컴파일러가 그것을 알아낼 필요가 없습니다.

하지만 난 다른 절에서 SubClass2BaseClass에서 캐스트는 항상 null을 반환 SubClass2 형식의 개체로이 메서드를 호출 할 때.

표시된 코드에서는 불가능합니다. 이와 같은 형 변환은 null 인 경우에만 null으로 해결할 수 있으며 코드의 해당 시점에 이 될 수 없으면 GetType은 Null 참조 예외를 발생시킵니다. 난 방법을 입력하면 즉시, 즉 I는 variable 선언 임의의 도달 전에 볼 코드를 디버깅 할 때

, variable

라는 제 1 가변 [...] 형 SubClass1이며 variable의 유형은 SubClass1입니다. 두 번째 유형은 SubClass2입니다. 컴파일 타임처럼 이러한 변수의 유형을 정의한 것입니다.

어떤 소스가 obj의 캐스트가 null을 반환하는 이유입니다. 앞서 언급 한 바와 같이

, 그것은 null 결과 하지입니다. 그것은 할 수 없다. 변수가 올바른 유형이 아닌 경우 코드가 컴파일되지 않습니다.; 런타임시 값을 변경하지 않습니다.

누구도 왜 variable에 선언되기 전에 유형이 있는지 말해 줄 수 있습니까?

모든 변수의 유형은 컴파일 할 때 선언 한 행에서 결정됩니다.

+0

모든 진술에 동의 할 것입니다. 정확히 어떻게 작동하는지 알 수 있습니다. 하지만 지금은 실제로 다른 행동을 경험하고 대답은 "그럴 수 없어"아무것도 나에게 도움이되지 않습니다 – user613068

+0

@ user613068 당신이 실제로보고있는 것을 보지 못하거나 귀하의 코드가 표시된 코드와 다릅니다. – Servy