为什么"foo不是{}bar"在语义上不等同于"!(foo是{}bar)`



让我们在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问题。

来自文档的更多见解:

如果我们选择将此类工作推迟到以后(我建议(,我们可以说在notor下面的C#中,模式变量可能不会被声明。然后,我们将有时间发展一些经验,让我们深入了解以后放松的可能价值。

最新更新