【问题标题】:Attempting to return result in custom async method doesn't compile尝试在自定义异步方法中返回结果无法编译
【发布时间】:2021-02-02 14:39:04
【问题描述】:

我一直在尝试创建一种可以等待的方法,即在 .NET 5 中异步。

根据我对异步的了解,这应该可以:

public Task<int> AsyncMethod()
{
    return 3;
}

当然,这将立即返回,等待它没有任何意义,但问题是 Visual Studio 在“返回”行给我一个错误,并且该错误是“无法隐式地将类型 'int' 转换为'System.Threading.Tasks.Task'" 这看起来很奇怪,因为我认为这正是你应该这样做的方式。

如果我将return 3 更改为return Task.FromResult(3),那么它会起作用,但我想知道为什么第一个不起作用并且这两件事完全一样?

【问题讨论】:

    标签: asynchronous task .net-5


    【解决方案1】:
    public Task<int> AsyncMethod()
    

    也就是说这个方法返回一个Task&lt;int&gt;类型的值。这与您的return 3 不匹配,因此会导致错误。

    要自动从return 3 转换为Task&lt;int&gt;,您需要将方法声明更改为:

    public async Task<int> AsyncMethod()
    

    【讨论】:

    • 呵呵...我以为只添加了“async”关键字是不是需要在方法体中使用“await”?
    • 有点.. async 将方法转换为状态机。然后可以直接返回值(状态机处理Tasks)。如果你不让它成为一个状态机,你必须自己处理Task 转换。
    • A-a-a-a-a-and,将其设为 asyncreturn 3 与未将其设为 async 并执行 return Task.FromResult(3) 相同吗?
    • 是的,这是两个不同的东西!您可以使用sharplap.io 看到编译器将这些转换为什么。比较 Task.FromResultasyncasync 版本被转换为状态机,与您编写的代码惊人地不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多