C# FirstOrDefault()无法与??操作人员

C# FirstOrDefault()无法与??操作人员,c#,linq,C#,Linq,据我所知,如果记录集为空,linq方法FirstOrDefault()将返回null。为什么不能对函数使用?运算符?像这样: Double d = new Double[]{}.FirstOrDefault() ?? 0.0; 更新 我不想稍后在我的代码中检查d是否为null。并且做: Double d new Double[]{}.FirstOrDefault() == null ? 0.0 : new Double[]{}.FirstOrDefault();

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

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

更新

我不想稍后在我的代码中检查
d
是否为
null
。并且做:

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

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

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

。。。似乎有点过头了——我想在一行代码中执行此空检查。

因为空合并运算符()仅适用于可空引用类型,而它是值类型。您可以使用可为空的双精度(
double?
)。

使其可为
为空应该可以工作。但是,那么您是否将其设置为可为空取决于您的场景

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

实际上,
FirstOrDefault()
返回T,T是一个值或
default(T)


default(T)
对于值类型(如
double
)来说是
null
(T)0

该方法称为FirstOrDefault not FirstOrNull,也就是说,它将返回0,即double的默认值,因此不需要使用???。

尽管其他人已经回答了为什么这里有编译问题,您是对的,这对于值类型是有问题的。据我所知,在这种情况下,没有办法知道结果为零是因为第一项实际上为零,还是因为
IEnumerable
为空

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

var r = new double[]{...}.FirstOrDefault();
假设您有一个非零的回退值,您有几个选项:

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


@FuleSnabel是绝对的,因为
0.0
是double的默认值默认值(双)
的code>将接受您的答案。但詹姆斯·科伦(James Curran)提供了一个更详细的方案。谢谢你,本。
var r = myDoubles.Cast<double?>().FirstOrDefault() ?? fallback;
var r = myDoubles.FirstOrFallback(fallback);