gpt4 book ai didi

c# - 空合并运算符不接受不同类型

转载 作者:行者123 更新时间:2023-12-05 09:11:29 25 4
gpt4 key购买 nike

我开始,返回一个自定义类:

[HttpGet()]
public ActionResult<Round> Get(string id) =>
this._roundsService.Get(id);

轮次服务中的 Get 方法可以返回 null 并转换为 HTTP 204 No Content。我想知道当我得到 null 时如何返回 404:

[HttpGet()]
public ActionResult<Round> Get(string id) =>
this._roundsService.Get(id) ?? NotFound();

显然这不起作用,并给我一个 CS0019 错误:Operator '??'不能应用于“Round”和“NotFoundResult”类型的操作数

我对其他单行代码持开放态度,如果不为空则返回所需对象,如果为空则返回 404。

我正在使用 C# 8.0 和 netcoreapp3.0 框架。我没有启用可为空的功能。这会导致问题吗?

以防万一,这是服务类中的方法:

public Round Get(string id) =>
this._rounds.Find(round => round.Id == id).FirstOrDefault();

最佳答案

当您调用 NotFound() 时,您正在创建一个 NotFoundResult .您的方法的返回类型为 ActionResult<Round>但是NotFoundResult实际上并没有继承自 ActionResult<Round> , 所以你不能返回 NotFoundResult直接反对。

当您输入 return NotFound() 时那么实际发生的是编译器将使用 implicit operator ActionResult<T> (ActionResult) 改造 NotFoundResult进入ActionResult<Round> .

这在您直接返回值时工作正常,但在三元条件表达式或 null 合并表达式中使用时它将不起作用。相反,您必须自己进行转换:

public ActionResult<Round> Get(string id) =>
this._roundsService.Get(id) ?? new ActionResult<Round>(NotFound());

因为 constructor of ActionResult<T> 接受任何 ActionResult , 你可以只传递 NotFoundResult以确保它得到正确转换。

当然,你也可以把它再拆开,让编译器帮你转换:

public ActionResult<Round> Get(string id)
{
var result = this._roundsService.Get(id);
if (result != null)
return result;
return NotFound();
}

关于c# - 空合并运算符不接受不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60040036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com