FirstOrDefault()无法与??操作者

时间:2010-08-13 11:41:18

标签: c# linq

据我所知,如果记录集为空,则linq方法FirstOrDefault()将返回null。为什么不能对函数使用??运算符?像这样:

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


更新

我不希望稍后在我的代码中检查dnull。做:

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

......或:

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

Double d = r == null ? 0.0 : r;

...似乎有点矫枉过正 - 我想在一行代码中进行空值检查。

5 个答案:

答案 0 :(得分:11)

因为null-coalescing运算符(??)仅适用于可空引用类型,而Double是值类型。您可以使用可以为空的双(double?)。

答案 1 :(得分:10)

实际上,FirstOrDefault<T>()会返回T,这是值或default(T)

对于值类型,

default(T)可以是null(T)0(例如double

答案 2 :(得分:5)

该方法被称为FirstOrDefault而不是FirstOrNull,即它将返回0,无论如何都是double的默认值,因此不需要??。

答案 3 :(得分:1)

使nullable成功。但是,那么你制作它nullable,一切都取决于你的情景......

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

答案 4 :(得分:0)

虽然其他人已经解答了为什么你在这里遇到编译问题,但你认为这对于值类型是有问题的。据我所知,在这种情况下无法知道零的结果是因为第一项真的是零,还是因为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);