C#中if语句使用var做is模式匹配为何可能触发空引用异常?
原因说明
这是C#中is关键字匹配不同模式时的规则差异导致的:
- 你用到的
is Bar bar属于类型模式,该模式只有同时满足「左侧表达式的运行时类型和Bar兼容」、「左侧表达式结果不为null」两个条件时,才会返回true进入if分支。当GetBar()返回null时,匹配直接失败,不会走到调用Baz()的代码,自然不会有空引用异常。 - 而
is var bar属于var模式,该模式的匹配规则是永远返回true,不会做null校验,只会直接把左侧表达式的结果赋值给声明的bar变量。也就是说哪怕GetBar()返回null,也会进入if分支,此时调用bar.Baz()就会触发空引用异常。
如果你想用var模式实现和类型模式一致的空校验效果,需要手动补充非空判断:
if (foo.GetBar() is var bar && bar != null) { bar.Baz(); }
内容的提问来源于stack exchange,提问作者Wouter。
相关产品推荐
相关产品推荐

