为什么移除 async/await 会导致 Task<T> 到 Task<object> 的转换错误

Rob*_*est 1 c# asynchronous async-await

我有以下通用和非通用方法:

public async Task<T> LoadAsync(Guid id)
{
    return await _someService.SomeMethodAsync(id);
}

async Task<object> LoadObjectAsync(Guid id) => await LoadAsync(id);
Run Code Online (Sandbox Code Playgroud)

尝试遵循Stephen Cleary建议,我想通过从LoadObjectAsync方法中删除 async/await 来提高代码效率,因为它是一个传递。但是,当我将签名更改为:

Task<object> LoadObjectAsync(Guid id) => LoadAsync(id);
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,说我不能隐式地从 转换Task<T>Task<object>。我想知道的是 async await 如何避免这个转换问题?我知道通用差异禁止转换,Task<>但为什么这不适用于 async/await 版本?

Ste*_*ary 5

尝试遵循 Stephen Cleary 的建议

那篇文章中的建议是“除非您需要删除它,否则将async/await留在那里”。在这种情况下,该方法看起来像一个传递,但实际上是在执行隐式转换。

我想知道的是为什么 async await 避免了这个转换问题?

使用asyncawait,代码将强制转换Tobject,这始终是允许的。

如果没有asyncawait,代码将强制转换Task<T>Task<object>,这是不允许的。这是因为类不能支持泛型variance,并且没有ITask<T>类型。