理论问题:如果您使用结构
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
答案 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也有很多细节。