2013-10-03 3 views
3

(실제 제목은 " 'System.Runtime.CompilerServices.VoidTaskResult]'형식의 개체를 'System.Runtime.CompilerServices.askTaskResult'형식으로 캐스팅 할 수없는 이유는 'System.Runtime .CompilerServices.INotifyCompletion '는 "그러나 불행하게도이에 유래 너무 깁니다. :)작업 반환 메서드를 기다리는 중 InvalidCastException이 발생하는 이유는 무엇입니까?

안녕,

await에 내 방법의 실행을 시도 할 때 정말 독특한 문제를 얻고있다. 호출하는 코드는이 (발췌)과 같습니다

private async Task DownloadAddonFileAsync(dynamic addon, dynamic file, string targetFolder) 
    { 
     // ... 
     await DownloadFileAsync(file, targetFolder, uri); 

을 DownloadFileAsync은 다음과 같습니다

protected async Task DownloadFileAsync(dynamic file, string targetFolder, string uri) 
    { 
     // ... 
     var fileBytes = await AppLoaderRestClient.GetAsync<byte[]>(uri); 

AppLoaderRestClient.GetAsync(), 차례 차례로, 다음과 같습니다

public static async Task<T> GetAsync<T>(string uri) 
    { 
     // ... 
     if (typeof (T) == typeof (byte[])) 
     { 
      var result = await webClient.DownloadDataTaskAsync(uri); 
      return (T) (object) result; 
     } 

그래서 여기에는 실제로 체인의 작업이 있습니다. "내부"작업은 호출자에게 전파되어 Tas로 변환 된 작업입니다. k (즉, 결과가없는 태스크). 이 문제로 인해이 문제가 발생할 수 있다고 생각합니까? 나는이에 가장 바깥 쪽 코드를 변경하는 경우

는 :

 var task = DownloadFileAsync(file, targetFolder, uri); 
     task.Wait(); 

를 ... 그것은 완벽하게 작동합니다. 왜?

답변

8

때로는 밝혀졌지만 여기에 게시하는 동안 질문에 대한 답변을 찾을 수있었습니다. 나는 두통에서 다른 사람을 구하기 위해 그것을 공유 할 줄 ​​알았는데 ...

이 문제는 동적 인 사용 또는 오히려 (내 의견으로는) C# /. NET에서의 동적 작동이 약간 제한적이고 깨진 방식으로 작용합니다. 아직은. 내 코드를 다음과 같이 바꾸면 :

await (Task)DownloadFileAsync(file, targetFolder, uri); 

... 완벽하게 작동합니다.

여기에있는 것은 내 매개 변수 (file이 동적 임) 중 하나이므로 동적 인 작업입니다. 반환 값은 동적 연산에서 어떻게 든 엉망이 된 것처럼 보입니다. CLR은 메서드가 Task 또는 Task<T> (또는 그렇게 추측합니다)을 반환하는지 위의 코드에서 간단하게 추론 할 수 없습니다. 따라서 결과를 INotifyCompletion 인스턴스로 캐스팅하지 못합니다. 따라서 예외가 발생합니다.

감사합니다. 로트, Microsoft. ;)
(여기서 중요한 문제는 예외 메시지가 매우 불분명하다고 생각합니다. 내 의견으로는 ...)

관련 문제