具有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
。
在我的第一个例子中,当我使用可为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
...