无法将类型“ Microsoft.AspNetCore.Mvc.NotFoundResult”隐式转换为“ System.Threading.Tasks.Task”

时间:2019-10-07 19:27:49

标签: c# asp.net-core asp.net-web-api

考虑这样的控制器动作:

[HttpGet]
[Route("blog/{slug}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<Blog> Get(string slug)
{
    return await Task.Run(() =>
    {
        var model = Data.GetBlog(slug);
        if (model == null)
        {
            return NotFound();
        }
        return Ok(model);
    });
}

每个退货单都出现错误:

Cannot implicitly convert type 'Microsoft.AspNetCore.Mvc.NotFoundResult' to 'System.Threading.Tasks.Task'
Cannot implicitly convert type 'Microsoft.AspNetCore.Mvc.OkObjectResult' to 'System.Threading.Tasks.Task'
Cannot convert lambda expression to intended delegate type because some of the return types in the block are not implicitly convertible to the delegate return type

如果我注释掉其中一种响应类型(因此仅使用NotFound()或仅使用Ok()),则可以正常编译。

我认为它们都继承自相同的基类,因此都可以在同一操作中使用。

我要去哪里错了?

p.s。在编写异步Data方法之前,Task.Run是我的懒惰。

1 个答案:

答案 0 :(得分:3)

Task.Run代码正在返回IActionResult派生的结果,您尝试将其返回为Blog类型。因此错误

这就是ActionResult<T>的作用。

请考虑以下重构。

[HttpGet]
[Route("blog/{slug}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<Blog>> Get(string slug) {
    Blog model = await Task.Run(() => Data.GetBlog(slug));
    if (model == null) {
        return NotFound();
    }
    return model;    
}

引用Controller action return types in ASP.NET Core Web API