25

我刚刚阅读了一篇 SO帖子,该帖子解释了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?>()根据已链接的帖子追加,以便null在查询返回 0 结果时获取。

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

int?对于我的第一个示例,当我使用 Nullable int ( ) 而不是常规时,为什么我不会收到编译时错误(或至少是警告)int

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

4

1 回答 1

20

int对于我的第一个示例,当我使用 Nullable而不是常规时,为什么我不会收到编译时错误(或至少是警告)int?如果我理解正确,使用 int? 执行我的第一个查询时,将永远不会产生null.

你的理解是正确的。但是,编译器不会干扰您将变量声明a为可为空的愿望,因为它是一种“扩展”转换:即使来自 LINQ 查询的赋值永远不会返回 a 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
...
于 2013-07-21T17:44:55.623 回答