C# ASP.NET Core MVC 控制器函数 OkObjectResult 在函数定义中有或没有异步时有不同的行为

问题描述 投票:0回答:1

我们正在对 ASP.NET Core MVC 控制器类中的以下示例程序进行故障排除。

    [MapToApiVersion("1.0")]
    [HttpPost("TestFunction")]
    public Task<IActionResult> TestFunction()
    {
        return Ok("OK");
    }

此代码会导致编译器错误

CS0029:无法将类型“Microsoft.AspNetCore.Mvc.OkObjectResult”隐式转换为“System.Threading.Tasks。

但是,如果我们将

async
添加到函数定义中并使其

public async Task<IActionResult> TestFunction() { ... }

错误消失。

我们想知道为什么。

c# asp.net-core-mvc
1个回答
0
投票

Ok()
方法返回一个
OkObjectResult
类型,该类型实现了
IActionResult
。如果您的方法根本不是异步的,并且返回类型定义为
IActionResult
,您可以返回此 OkObjectResult 并且它将编译,因为可以将
OkObjectResult
类型转换为
IActionResult

使用

async
关键字,该函数会将返回结果“包装”在
Task
对象中,从而形成类型
Task<OkObjectResult>
,该类型可转换为
Task<IActionResult>
,这是方法定义的返回类型。有关此过程的更多信息,请访问:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/async#return-types

如果没有

async
关键字,您将尝试返回
OkObjectResult
,但方法的返回类型定义为
Task<IActionResult>
。因此出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.