C# FirstOrDefault()无法与??操作人员
据我所知,如果记录集为空,linq方法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();
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);