Не удается неявно преобразовать тип «Microsoft.AspNetCore.Mvc.NotFoundResult» в «System.Threading.Tasks.Task» - PullRequest
1 голос
/ 07 октября 2019

Рассмотрим действие контроллера следующим образом:

[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()), он прекрасно компилируется.

Я думал, что оба наследуют один и тот же базовый класс и поэтому оба могут использоваться в одном действии.

Где я иду не так?

ps Задача. Запуск - я ленива, пока не напишу асинхронные Data методы.

1 Ответ

3 голосов
/ 07 октября 2019

Код 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;    
}

Ссылка Типы возвращаемых действий контроллера в ASP. NET Core Web API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...