C# 为什么is type/is var对null产生不同的结果?

C# 为什么is type/is var对null产生不同的结果?,c#,c#-7.0,C#,C# 7.0,理论问题:如果你使用这个结构 if (someVar is object o) { 如果为someVar输入null,结果将为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();

理论问题:如果你使用这个结构

if (someVar is object o) {
如果为
someVar
输入
null
,结果将为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

简单回答:因为
is object
被指定为包含隐式空检查,但是
is var
被指定为not

我能找到的最好的文档(尽管它特别涉及switch语句,而不是if语句):

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

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

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

我不能说我理解这个(国际海事组织)有点奇怪的决定背后的原因


正如@Camilo在评论中指出的,其中包含了更多细节。还有很多细节。

好的,基本答案是“按定义”:-)谢谢你的文档链接。我可以添加一个答案,但我会给你更多信息。看看“var模式”下面,这里对var模式有一个很好的解释:@Dirk听起来像是一个足够好的复制品。为什么是一个应该在C#GitHub repository上提出的自以为是的问题第二个副本甚至添加了进一步的信息:“但是,有两种情况需要var:对于匿名类型或者如果您想允许null,后者是因为null与任何类型都不匹配。”