与null-coalescing运算符混合时,FirstOrDefault意外结果

时间:2014-01-21 13:24:34

标签: c# linq-to-objects null-coalescing-operator

我有一个需要查询对象的场景,如果返回null,那么我需要以不同方式查询同一个对象,我决定使用null-coalescing运算符,这里是代码:

 var requestedMaterials = request.Lines.FirstOrDefault(
                          w => w.Description.Trim() == material.Description.Trim() &&
                          w.Grade.Grades.Any(q => q.Quantity > 0)) ??
                          request.Lines.FirstOrDefault(w => w.Description.Trim() ==  material.Description.Trim() && w.Quantity > 0)

左手操作数应该返回null,事实上,右手不是,如果我将它设置为变量我可以看到它不为null,但由于某种原因,当我以这种方式使用这两个查询时,请求材料为null,而不是具有右手操作数的值。

我已经确认,当我将这两个查询设置为变量并使用'??'时对它们的操作,它按预期工作,我现在已经这样离开了,但我真的很好奇为什么它不起作用。

工作示例(requestedMaterials填充了materialsWithoutGrade):

var materialsWithGrade = request.Lines.FirstOrDefault(w => w.Description.Trim() == material.Description.Trim() &&  w.Grade.Grades.Any(q => q.Quantity> 0));
var materialsWithoutGrade = request.Lines.FirstOrDefault(w => w.Description.Trim() == material.Description.Trim() && w.Quantity> 0);

var requestedMaterials = materialsWithGrade ?? materialsWithoutGrade;

1 个答案:

答案 0 :(得分:0)

如果匹配找到,FirstOrDefault返回一个值,否则返回默认值(TSource)。 ?? ??返回默认值(TSource),可以是任何值(null或TSource类型的默认值)。将结果分配给变量后,now变量保持空值。所以?能够按预期工作。