【发布时间】:2018-08-08 08:55:14
【问题描述】:
使用 ASP.NET Core 2.1 获取以下代码:
[HttpGet("/unresolved")]
public async Task<ActionResult<IEnumerable<UnresolvedIdentity>>> GetUnresolvedIdentities()
{
var results = await _identities.GetUnresolvedIdentities().ConfigureAwait(false);
return results.ToList();
}
既然GetUnresolvedIdentities()返回IEnumerable<UnresolvedIdentity>,我会认为我可以返回
return await _identities.GetUnresolvedIdentities().ConfigureAwait(false);
除非我不能,因为我收到此错误:
CS0029 无法隐式转换类型
'System.Collections.Generic.IEnumerable<Data.Infrastructure.Models.UnresolvedIdentity>'到'Microsoft.AspNetCore.Mvc.ActionResult<System.Collections.Generic.IEnumerable<Data.Infrastructure.Models.UnresolvedIdentity>>'
我需要.ToList(),这很烦人,因为它是 2 行而不是 1 行。
为什么ActionResult<T> 不能确定GetUnresolvedIdentities() 返回一个IEnumerable<> 并直接返回?
GetUnresolvedIdentities的签名是:
Task<IEnumerable<UnresolvedIdentity>> GetUnresolvedIdentities();
【问题讨论】:
-
因为
IEnumerable与IEnumerable<T>不同。更改_identities.GetUnresolvedIdentities返回类型或您的控制器返回类型。 -
为什么不
return await _identities.GetUnresolvedIdentities().ConfigureAwait(false).ToList();,如果“两行”是唯一困扰你的事情? -
@Corak 因为你不能
task.ToList()。(await task).ToList()会起作用 -
您可以使用 Ok 辅助方法将其包装在 ActionTask 中:
return Ok(await _identities.GetUnresolvedIdentities());。附言你不应该在控制器内部调用.ConfigureAwait(false),除非你100% 确定后果(尽管现在它不像在旧版ASP.NET 中那样严重)。建议始终在 通用库 中使用它,因为它不知道该库将在哪个上下文中使用 -
您实际上不需要在 ASP.NET Core 的任何地方使用
ConfigureAwait,因为它没有同步上下文。
标签: c# asp.net-core actionresult asp.net-core-2.1