2011-08-02 2 views

답변

7

님 놀라게해서는 안 그래서 그들은, 컴파일 시간에 있지 실행 시간을 포착하고 있습니다.

우리가 코드에서 암시 적 입력을 제거하면, 그것은 조금 더 명확하게 :

object bInstanceReflection = Activator.CreateInstance(typeof (B)); 
Console.WriteLine(bInstanceReflection.GetType()); // <assemblyname>.B 
A aInstanceReflection = (A) bInstanceReflection; 

지금은 마지막 줄에, (A) 정상적인 참조 변환을 수행 object에서 불과 캐스트는 것을 합리적으로 분명 . 사용자 정의 변환은 전혀 적용되지 않습니다. 당신이 .NET 4를 사용하는 경우

, 당신은 그것을 얻 동적 입력을 사용할 수 있습니다

이제 변환은 어떤 변환의 검색을 의미 동적 값에 적용되고
// Note the change of type 
dynamic bInstanceReflection = Activator.CreateInstance(typeof (B)); 
Console.WriteLine(bInstanceReflection.GetType()); // <assemblyname>.B 
A aInstanceReflection = (A) bInstanceReflection; 

사용은 실행 시간까지 연기되며, 사용자 정의 연산자가 사용됩니다.

var bInstanceReflection = Activator.CreateInstance(typeof (B)); 

하려면 :

var bInstanceReflection = (B)Activator.CreateInstance(typeof (B)); 

그래서 컴파일러는 지금 bInstanceReflection의 유형을 알고 올바른 implitic 연산자를 호출 할 수 있습니다

+0

감사합니다 존, 당신 게시물은 나를 위해 매우 유용합니다! – Alex

3

B을 만들었습니다. 그런 다음 A으로 전송합니다.

유사한 레이아웃을 갖는 불구하고, B는 컴파일러에 의해인가 A. 정적 연산자는 관계가없는 아니라 런타임 캐스트 비아. C# 구문은 동일하지만 리플렉션을 처리 할 때 구문이 매우 다릅니다.

이것은 정상적인 동작입니다. 그들은 과부하, 사용자 정의 운영자는하지 재정 아무것도 - -

+0

감사합니다. 마크, 정말 새로운 것이 었습니다. 나는 또한 비슷한 질문에 대한 답변을 에릭 Lippert 발견 http://stackoverflow.com/questions/2090092/is-there-a-way-to-do-dynamic-implicit-type-casting-in-c – Alex

1

당신은 단순히이 줄을 변경할 수 있습니다.

관련 문제