让我们在C#中有string foo
变量。
为什么以下语句在语义上不等价?
if (!(foo is { } bar) || bar.Length == 0)
和
if (foo is not { } bar || bar.Length == 0)
对于foo = null
,两者的行为似乎相同。
var foo = null;
if (!(foo is { } bar) || bar.Length == 0)
{
Console.WriteLine("bar");
}
if (foo is not { } baz || baz.Length == 0)
{
Console.WriteLine("baz");
}
但对于foo = "something"
,第一个语句有效,但第二个语句对于NullReferenceException
失败。
检查sharplab。
这是一个功能吗?
编辑:这似乎是一个错误:https://github.com/dotnet/roslyn/issues/51996#issuecomment-803508111
来自对问题的评论:
您是否遇到了明确分配的问题?根据文档,只有当
is
模式为true时,模式变量才被认为是明确分配的。变更日志链接到许多关于这个主题的git问题。
来自文档的更多见解:
如果我们选择将此类工作推迟到以后(我建议(,我们可以说在
not
或or
下面的C#中,模式变量可能不会被声明。然后,我们将有时间发展一些经验,让我们深入了解以后放松的可能价值。