我们正在对 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() { ... }
错误消失。
我们想知道为什么。
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>
。因此出现错误。