ASP.NET Core MVC:有无async的OkObjectResult编译差异及原因咨询
问题原因解析
先看触发编译错误的代码:
[MapToApiVersion("1.0")] [HttpPost("TestFunction")] public Task<IActionResult> TestFunction() { return Ok("OK"); }
编译时报错:
CS0029: 无法将类型“Microsoft.AspNetCore.Mvc.OkObjectResult”隐式转换为“System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>”
核心原因:
- 不带
async修饰符时,方法必须直接返回与声明的返回类型完全一致的值。这里方法声明返回Task<IActionResult>,但Ok("OK")生成的是OkObjectResult(仅实现了IActionResult接口),并非Task包裹的类型,类型不匹配导致编译失败。 - 加上
async修饰符后,C#的异步语法糖会自动处理返回值:只要你返回IActionResult类型的对象,编译器会自动把它包装成已完成的Task<IActionResult>,完美匹配方法的返回类型,因此编译正常。
替代方案(无需async的情况)
如果不想加async,可以手动把结果包装成Task:
[MapToApiVersion("1.0")] [HttpPost("TestFunction")] public Task<IActionResult> TestFunction() { return Task.FromResult<IActionResult>(Ok("OK")); }
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

