gpt4 book ai didi

c# - 如何在 ActionResult ASP.NET Core 2.1 中使用空合并运算符

转载 作者:行者123 更新时间:2023-11-30 22:56:22 25 4
gpt4 key购买 nike

有人能解释一下为什么我在使用以下方法进行空合并时遇到错误吗:

private readonly Product[] products = new Product[];

[HttpGet("{id}")]
public ActionResult<Product> GetById(int id)
{
var product = products.FirstOrDefault(p => p.Id == id);
if (product == null)
return NotFound(); // No errors here
return product; // No errors here

//I want to replace the above code with this single line
return products.FirstOrDefault(p => p.Id == id) ?? NotFound(); // Getting an error here: Operator '??' cannot be applied to operands of type 'Product' and 'NotFoundResult'
}

public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}

我不明白的是为什么第一个返回不需要任何转换就可以工作,而第二个单行空合并不起作用!

我的目标是 ASP.NET Core 2.1


编辑:谢谢@Hasan@dcastro对于解释,但我不建议在这里使用空合并作为 NotFound()转换后不会返回正确的错误码!

return (ActionResult<Product>)products?.FirstOrDefault(p => p.Id == id) ?? NotFound();

最佳答案

OP 的问题可以分为两部分:1) 为什么建议的空合并表达式无法编译,以及 2) 在 ASP.NET Core 2.1 中是否有另一种简洁(“单行”)方式返回结果?

如@Hasan 的回答的第二次编辑所示,null-coalescing operator 的结果类型根据操作数类型而不是目标类型进行解析。因此,OP 的示例失败了,因为 ProductNotFoundResult 之间没有隐式转换:

products.FirstOrDefault(p => p.Id == id) ?? NotFound();

@Kirk Larkin 在评论中提到了一种修复它的方法,同时保持简洁的语法:

products.FirstOrDefault(p => p.Id == id) ?? (ActionResult<Product>)NotFound();

从 C# 8.0 开始,您还可以使用 switch expression :

products.FirstOrDefault(p => p.Id == id) switch { null => NotFound(), var p => p };

关于c# - 如何在 ActionResult ASP.NET Core 2.1 中使用空合并运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54515704/

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