【问题标题】:The non-generic method 'ControllerBase.Ok()' cannot be used with type arguments非泛型方法“ControllerBase.Ok()”不能与类型参数一起使用
【发布时间】:2020-03-23 15:47:03
【问题描述】:

我有 asp.net 核心 web api 应用程序,其中控制器类从 Controller : ControllerBase 扩展,现在我收到错误

非泛型方法 'ControllerBase.Ok()' 不能与类型参数一起使用

对于下面的api代码,这里有什么问题?

[HttpPost]
    public async Task<bool> Post()
    {
        return Ok<bool>(await _someTask);
    }

根据下面的评论,我是这样实现的,

[HttpPost]
    public async Task<ActionResult<bool>> Post()
    {
        return Ok(await SomeTask());
    }

    private async Task SomeTask()
    {
        //some database insert operation
        throw new NotImplementedException();
    }

然后我在return Ok(await SomeTask()); 遇到错误,

无法从“void”转换为“object”Controller.cs 49 Active

【问题讨论】:

  • Ok&lt;T&gt;() 不存在。您是否从早期的 aspnet 核心版本升级?
  • 没有。 it;s 全新的 asp.net core 3.1 web api 应用程序
  • @JohnWu 实际上,它应该返回Task&lt;IActionResult&gt;,而IActionResult 的实现应该是ActionResult&lt;bool&gt; - 所以最具描述性的返回类型应该是Task&lt;ActionResult&lt;bool&gt;&gt;
  • 为什么您希望您的操作方法具有Task&lt;bool&gt;Task&lt;ActionResult&lt;bool&gt;&gt; 的返回类型?

标签: c# asp.net-core-3.1


【解决方案1】:

The ControllerBase's Ok method 有两个重载:Ok()Ok(object)

没有通用重载,这就是您收到错误消息的原因。

附带说明,虽然对于这个简化版本是 perfectly fine to return a Task&lt;bool&gt;,但更现实的情况是一个方法有多个代码路径,或者至少有多个预期输出(例如,它可能返回 404或 500 个 http 状态代码 - 用于未找到/内部服务器错误)。

在这些情况下,您希望返回 Task&lt;ActionResult&lt;T&gt;&gt;。 这样,在使用 swagger 等工具自动生成客户端代码时,您将获得更适合您的 api 的客户端。

更新
您的await 放错地方了。
另外,如果你想返回一个bool,那么你的另一个async方法应该返回Task&lt;bool&gt;

尝试以下方法:

[HttpPost]
public async Task<ActionResult<bool>> Post()
{
    var result = await SomeTask();
    return Ok(result);
}

private async Task<bool> SomeTask()
{
    //some database insert operation
    throw new NotImplementedException();
}

【讨论】:

  • 谢谢,当我试图回复Task&lt;ActionResult&lt;bool&gt;&gt;时,请查看我的评论cannot convert from 'void' to 'object'Controller.cs 49 Active
  • 好的,谢谢。赞赏
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多