代码之家  ›  专栏  ›  技术社区  ›  cllpse

FirstOrDefault()无法与配对?运算符

  •  6
  • cllpse  · 技术社区  · 14 年前

    据我所知,LINQ方法 FirstOrDefault() 收益率 null 如果记录集为空。为什么不能用 ?? 操作员反对该功能?像这样:

    Double d = new Double[]{}.FirstOrDefault() ?? 0.0;
    


    更新

    我不想检查 d 无效的 稍后在我的代码中。做:

    Double d new Double[]{}.FirstOrDefault() == null
           ? 0.0 
           : new Double[]{}.FirstOrDefault();
    

    …或:

    var r = new Double[]{}.FirstOrDefault();
    
    Double d = r == null ? 0.0 : r;
    

    …似乎有点过头了——我想在一行代码中进行这种空检查。

    5 回复  |  直到 14 年前
        1
  •  10
  •   James Curran    14 年前

    事实上, FirstOrDefault<T>() 返回t,它是一个值或 default(T) .

    缺省(t) 要么是 null (T)0 对于值类型(如 double )

        2
  •  11
  •   Darin Dimitrov    14 年前

    因为空合并运算符( ?? )仅适用于可为空的引用类型,而 Double 是值类型。您可以使用可以为空的double来代替( double? )

        3
  •  5
  •   Coding Flow    14 年前

    方法被称为FirstOrDefault而不是FirstOrNull,即它将返回0,即Double的默认值,因此不需要??

        4
  •  1
  •   Alex    14 年前

    制造它 nullable 应该工作。但是,那你就来吧 可空的 ,一切取决于您的方案…

    Double d = new Double?[] { }.FirstOrDefault() ?? 0.0;
    
        5
  •  0
  •   Ani    14 年前

    虽然其他人已经回答了为什么这里存在编译问题,但是对于值类型来说,这是有问题的,这是正确的。据我所知,在这种情况下,没有办法知道零的结果是因为第一个项真的是零,还是因为 IEnumerable<double> 是空的。

    在您给出的示例中,回退值始终为零,因此您所需要的只是:

    var r = new double[]{...}.FirstOrDefault();
    

    假设您有一个非零的回退值,那么您有几个选项:

    var r = !myDoubles.Any() ? fallback : myDoubles.First();
    

    var r = myDoubles.Cast<double?>().FirstOrDefault() ?? fallback;
    

    如果你有 Zen Linq Extensions 你可以这样做:

    var r = myDoubles.FirstOrFallback(fallback);