新手:创建enum.FirstOrDefault(),获取“无法隐式转换类型”

时间:2019-09-20 03:49:34

标签: c# lambda ienumerator

我想使用CartLine方法在Cart中找到并返回与产品匹配的第一个FindProductInCartLines(int productId)。如果找不到,请返回null

但是,编译器会抛出错误

  

无法隐式将类型:CartLine转换为Product

具有FirstOrDefault()行号。

我是关于lambda函数和委托的真正的新手。我以为它已被line.Product.Id取消引用,但显然我有某种误解。

我尝试使用来自Create IEnumerable<T>.Find()的JaredPar的答案 但是我看不出我的代码和他的代码之间的区别。

public class CartLine 
{
    public int OrderLineId { get; set; }
    public Product Product { get; set; }
    public int Quantity { get; set; }
}

public IEnumerable<CartLine> Lines => GetCartLineList();

private List<CartLine> GetCartLineList()
{
    return new List<CartLine>();
}

public Product FindProductInCartLines(int productId)
{
    return Lines.FirstOrDefault(line => line.Product.Id == productId);
}

2 个答案:

答案 0 :(得分:1)

调用FirstOrDefault()时,它将返回与源类型相同的对象,在您的情况下为Lines,类型为CartLine-这就是为什么您得到错误。要从父级获取子级属性,您需要在调用中添加对该属性的引用(允许为空)。

因此,在您的情况下,您需要:

public Product FindProductInCartLines(int productId)
{
    return Lines.FirstOrDefault(line => line.Product.Id == productId)?.Product;
}

如果不确定?.运算符,可以阅读this answer以获得很好的解释。

答案 1 :(得分:0)

// The method return type is Product
 public Product FindProductInCartLines(int productId){
               return Lines.FirstOrDefault(line => line.Product.Id == productId);// this line return CartLine object;
           }

您应该将方法的返回类型更改为CartLine

 public CartLine FindProductInCartLines(int productId){
               return Lines.FirstOrDefault(line => line.Product.Id == productId);
           }

如果您要退货

 public Product FindProductInCartLines(int productId){
               return Lines.FirstOrDefault(line => line.Product.Id == productId)?.Product;
           }