无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”

Sta*_*ord 5 .net c# ienumerable .net-core webapi

我正在尝试从数据库中获取条目列表。但我收到错误。

无法将类型“System.Collections.Generic.IEnumerable<models.DbModels.GrantProgram>”隐式转换为“Microsoft.AspNetCore.Mvc.ActionResult<System.Collections.Generic.IEnumerable<models.DbModels.GrantProgram>>”[API]

请帮我。我该如何解决这个问题?

控制器.cs

public async Task<ActionResult<IEnumerable<GrantProgram>>> GetGrants()
{
  //This is where the error is showing. 
  return await _grants.GetGrants(); 
}
Run Code Online (Sandbox Code Playgroud)

业务层

IGrants.cs

Task<IEnumerable<GrantProgram>> GetGrants(); 
Run Code Online (Sandbox Code Playgroud)

赠款.cs

public async Task<IEnumerable<GrantProgram>> GetGrants()
{
    return await _grantRepository.GetGrants(); 
}
Run Code Online (Sandbox Code Playgroud)

数据访问层

IGrantsRepository.cs

Task<IEnumerable<GrantProgram>> GetGrants(); 
Run Code Online (Sandbox Code Playgroud)

GrantsRepository.cs

public async Task<IEnumerable<GrantProgram>> GetGrants()
{
    return await _context.GrantProgram.ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)

mjw*_*lls 6

我怀疑你想要的代码是这样的

return new ActionResult<IEnumerable<GrantProgram>>(await _grants.GetGrants());
Run Code Online (Sandbox Code Playgroud)

为什么您现有的代码不起作用?因为(根据文档):

C# 不支持接口上的隐式转换运算符。

它建议:

因此,为了使用 ActionResult,必须将接口转换为具体类型。

严格来说这并不正确。这是一个选项,是的(例如调用ToList),但不是必需的。另一种选择(如我所示)是自己new升级ActionResult而不是依赖隐式转换)。

其他阅读: