2010-03-21 3 views
1

기본적으로이 작업을 수행하려고합니다. 잘못된 캐스트 예외가 발생합니다.
참고 : 어떤 것도 될 수 있습니다. 이것은 B가 아닐 수도 있지만 C, D, E, F 등이 될 수 있습니다. 그러나 o는 A로 타입 변환 할 수있는 클래스 인 경우에만 작동해야합니다 (B는 그런 클래스이고 암시 적 연산자 오버로드를 사용합니다)B가 A에 타입 캐스팅 할 수있을 때 클래스 A에 객체를 어떻게 캐스트합니까?

 var b = (B)"sz"; 
     var a = (A)b; 
     object o = b; 
     var aa = (A)o; 
+2

이 예제 코드는 더 읽을 수있다. –

+0

이 두 번째 시도로 물어 닫기로 투표 : http://stackoverflow.com/questions/2486791/how-do-i-cast-an-object-to-a-string-when-object-is- not-a-string/2486815 # 2486815 지금은 상황 정보가 훨씬 적습니다. –

+0

@Daniel Earwicker : 문자열 부분이 사람들을 혼란스럽게 만들고 내가 무엇을하고 있는지 느낀다. –

답변

4

다음을 시도해 보셨습니까?

[...] 
var ee = (A)(B)o; 

이 작동하고 코드를하지 않는 이유는 명시 적 캐스트가 컴파일 정적으로을 점이다. 즉, (A)o라고 말하면 컴파일러는 개체에서 A으로 명시적인 캐스트를 찾고 찾지 못합니다. 그러나 A은 object의 서브 클래스이므로 런타임에 캐스트가 실행 가능할 수 있으며 런타임에 인스턴스를 A 유형의 필드로 다운 캐스트하려고 시도합니다. 이러한 런타임 캐스트는 명시 적 및/또는 암시 적 변환과 관련이 없습니다. 이들은 단순히 내장 된 유형 계층 구조 규칙을 따릅니다.

또 다른 예 : 당신이 실제 추론 유형과`var` 키워드를 교체하는 경우

object o = 1.0; 
int i = (int)o; //throws InvalidCastException - even though (int)1.0 is OK. 
+0

이 부분을 더 명확하게 편집하십시오. –

+0

연산자 오버로드가 작동하지 않는 이유를 설명하는 +1. 나는 이것을 받아 들일 것이다. –

+0

오른쪽. 과부하 해결과 정확히 같습니다. "ob = giraffe"라고 말하면 메소드 M ​​(객체)와 M (동물)에 오버로드가 발생하면 M (ob)은 런타임에 ob이 무엇이든 상관없이 컴파일 시간에 객체 오버로드를 선택합니다. 컴파일러는 "B to A"변환 연산자보다 "A to A"변환 연산자를 선택합니다. 왜냐하면 컴파일 타임에 알려진 것이기 때문입니다. 그게 당신이 정적으로 입력 된 언어를 가지고 얻는 것입니다; (1) 동적 유형 지정 언어를 사용하거나 (2) C# 4에서 동적 키워드를 사용합니다. –

관련 문제