我刚刚读了一个SO post,它解释了FirstOrDefault()
的返回类型会根据所选元素的值而有所不同。
示例:
ICollection<String> list = new List<String>();
list.Add("bye");
int a = (from x in list where (x == "hi") select x.Length).FirstOrDefault();
在此示例中,a
将等于0,因为int
默认值为0。
但是,我可以根据已经链接的帖子附加.Cast<int?>()
,以便在查询返回0结果时获取null
。
int? a = (from x in list where ... x.Length).Cast<int?>().FirstOrDefault();
为什么我在第一个例子中使用Nullable int(int?
)而不是常规int
时,不会得到编译时错误(或至少是警告)?
如果我理解正确,在执行第一次查询时使用int?
,永远不会会产生null
的值。
答案 0 :(得分:12)
为什么我没有得到编译时错误(或至少是警告),对于我的第一个例子,我使用Nullable
int
而不是常规int
呢? 如果我理解正确,使用int?执行我的第一个查询时,永远不会产生null
的值。
您的理解是正确的。但是,编译器不会干扰您将变量a
声明为可空的愿望,因为它是一个&#34;扩展&#34;转换:即使来自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
...