Int和Int的FirstOrDefault行为?

时间:2013-07-21 17:37:39

标签: c# linq

我刚刚读了一个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的值。

1 个答案:

答案 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
...