在if语句中使用var
c#
鉴于:
public class Foo
{
public Bar GetBar() => null;
}
public abstract class Bar
{
public abstract void Baz();
}
这有效:
var foo = new Foo();
var bar = foo.GetBar();
if (bar != null)
{
bar.Baz();
}
这也有效:
var foo = new Foo();
if (foo.GetBar() is Bar bar)
{
bar.Baz();
}
但是为什么在 if 语句中使用 var 不起作用呢?
这可以编译但会抛出空引用异常:
if (foo.GetBar() is var bar)
{
bar.Baz(); // <-- bar can still be null?
}
回答
该var模式不匹配空值,而式模式不-这一切就是这么简单,真的。
从参考文档(强调我的):
从 C# 7.0 开始,您可以使用
var模式来匹配任何表达式,包括 null,并将其结果分配给新的局部变量阿
var当你需要一个内的临时变量图案是有用的Boolean表达保持中间计算的结果。var当您需要在 switch 表达式或语句的 case 守卫中执行额外检查时,您还可以使用模式
你可以使用一个简单的属性模式作为替代:
var foo = new Foo();
if (foo.GetBar() is {} bar)
{
bar.Baz();
}
这{}是一个匹配任何非空值的属性模式,但bar仍然像 via 一样输入var。