2012-12-12 5 views
1

런타임 예외가 불가 피한 동안 컴파일러에서이식이 컴파일되도록하는 이유는 무엇입니까? 는 C# 사양이 동적으로 이유를 다음과 같은 방법은 컴파일되지 않습니다 표현을 결합 위의 식을 참조하는 경우C# 동적 바인딩 및 void 메서드 호출

나는 Dynamic Binding 무효 방법

static void Main(string[] args) 
{ 
    var res = Test((dynamic)"test"); // throws RuntimeBinderException exception at runtime 
} 

static void Test(dynamic args) 
{ 
} 

을 위해 일해야한다고 생각하지 않는다?

static dynamic DynamicMethod() 
{ 
} 
+4

기본적으로 풀에'dynamic'을 던지면 어떤 종류의 컴파일 시간 검사도 창 밖으로 나옵니다. 그게 전부입니다. – Servy

+0

그래서 두 번째 방법은 컴파일 타임 예외를 발생시키는 이유는 무엇입니까? –

+0

두 번째 경우에는 아무것도 반환하지 않는다는 것을 알 수 있습니다. 런타임에 변경할 수있는 것이 없습니다. 반환 할 항목이 없습니다. 첫 번째 경우에는 (아직) 컴파일 및 실행을 허용하지 않는 다른 방법이있을 수 있습니다. – Servy

답변

3

테스트 (동적) "abc")는 전체적으로 동적 명령문으로 평가됩니다. 더 완벽하게, 당신은 할 수 :

public static string Test(string s) { return s; } 

이 더 나은 과부하 될 것이다, 그래서 선택하고 다른 방법에 우선하여 실행된다.

다른 말로하면 : method-group을 특정 서명으로 해석하지 않고 반환 값이 void인지 여부를 알 수 없습니다. 과부하 해결은 동적 호출의 런타임까지 지연된 정의로 입니다.

더 많은 분석을 수행 할 수 있습니까? 아마. 그러나 사양에는이 기능이 필요하지 않으므로 대부분의 경우 경고 일 수 있습니다 (오류가 아님).

+0

와우, 감사합니다. Marc that great –