为什么类型/ var为null会产生不同的结果?

时间:2019-04-11 13:20:38

标签: c# c#-7.0

理论问题:如果您使用结构

if (someVar is object o) {

,然后将null放在someVar中,结果将为false。另一方面,如果您使用

if (someVar is var o) {

结果将为真。为什么会这样?

完整的测试代码:

object obj = null;
if (obj is object o) {
    "object".Dump();
    o.Dump();
}

if (obj is var o2)
{
    "var".Dump();
    o2.Dump();
}

LinqPad中的结果:

var
null

1 个答案:

答案 0 :(得分:4)

简单的答案:因为is object被指定为包含隐式的空检查,而is var被指定为不包含空检查。

我能找到最好的文档is here(尽管它与switch语句特别相关,而不是if语句):

  

引入var作为match表达式之一为模式匹配引入了新规则。

     

第一个规则是var声明遵循正常的类型推断规则:将类型推断为switch表达式的静态类型。根据该规则,类型始终匹配。

     

第二条规则是var声明不包含其他类型模式表达式包含的null检查。这意味着该变量可能为null,在这种情况下,必须进行null检查。

我不能说我理解这个(IMO)有点奇怪的决定背后的原因...

正如@Camilo在评论中指出的,this article包含更多详细信息。 This question thread也有很多细节。