具有Int和Int的FirstOrDefault行为

本文关键字:Int 行为 FirstOrDefault 具有 | 更新日期: 2023-09-27 18:24:12

我刚刚读到一篇SO文章,其中解释了FirstOrDefault()的返回类型将根据所选元素的值而变化。

示例:

ICollection<String> list = new List<String>();
list.Add("bye");
int a = (from x in list where (x == "hi") select x.Length).FirstOrDefault(); 

在本例中,由于int的默认值为0,因此a将等于0。

然而,我可以根据已经链接的帖子附加.Cast<int?>(),以便在查询返回0个结果时获得null

int? a = (from x in list where ... x.Length).Cast<int?>().FirstOrDefault();

在我的第一个例子中,当我使用Nullable int(int?)而不是常规的int时,为什么不出现编译时错误(或者至少是警告)?

如果我理解正确,在执行第一个查询时使用int?将永远不会产生值null

具有Int和Int的FirstOrDefault行为

在我的第一个例子中,当我使用可为null的int而不是常规的int时,为什么我不会得到编译时错误(或者至少是警告)?如果我理解正确,使用int?当执行我的第一个查询时将永远不会产生值CCD_ 12。

你的理解是正确的。然而,编译器不会干扰您将变量a声明为可为null的愿望,因为这是一种"扩展"转换:即使LINQ查询的赋值永远不会返回null,您也可能对下面的相同变量有其他用途:

int? a = (from x in list where (x == "hi") select x.Length).FirstOrDefault();
// Do something with `a`, which will not be null
...
a = null;
if (someCondition) {
    a = someNotNullValue();
}
// Here, a may or may not be null
...