为什么在等待任务返回方法时出现InvalidCastException?

(问题的真正标题应该是“为什么我得到一个’无法播放’System.Runtime.CompilerServices.TaskAwaiter`1 [System.Runtime.CompilerServices.VoidTaskResult]’类型的对象’来键入’System.Runtime.CompilerServices .INotifyCompletion’“,但不幸的是,这对StackOverflow来说太长了。:)

嗨,

当我试图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(uri); 

反过来,AppLoaderRestClient.GetAsync()看起来像这样:

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

因此,这里实际上有一系列任务 – “内部”任务将是一个任务,然后将其传播到调用者,并转换为任务(即没有结果的任务)。 我认为这可能导致手头的问题?

如果我将最外面的代码更改为:

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

……它完美无瑕。 为什么?

有时候结果是,我在这里发布时设法找到问题的答案。 以为我会分享它以避免让别人头疼…

这个问题源于我使用动态,或者更确切地说,(在我看来)C#/ .NET中的动态作品略有限制和破碎。 如果我改写我的代码是这样的:

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

……它完美无瑕。

这里的事情是,由于我的一个参数( file是动态的),这将是一个动态操作。 并且返回值似乎以某种方式从动态操作中“搞砸了”; CLR根本无法从上面的代码中推断出该方法是返回Task还是Task (或者我猜)。 因此,它无法尝试将结果转换为INotifyCompletion实例 – 因此,exception。

非常感谢,微软。 ;)
(我认为这里的主要问题是exception消息非常不清楚,在我看来……)