首页 > 解决方案 > C# switch 表达式不正确的可空性

问题描述

我注意到,当使用包含空检查作为范围表达式的switch 表达式时,在 Visual Studio (16.7.6) 中未正确解释 arm/cases 中值的可空性状态。例如:

string? value = GetSomeString();
var description = (value != null) switch
{
    true when value.Length == 0 => "Empty",
    true when value.Length == 1 => "Uno",
    true when value.Length == 3 => "Third time's a charm",
    _ => "null"
};

在这里,我希望在 switch 块中知道所有实例value都不为空,给定我们正在打开的条件。最后一个/默认情况处理空情况。然而,Visual Studio 认为第一个实例可能为空:

在此处输入图像描述

我做错了什么,这是分析仪的错误,还是其他?

标签: c#visual-studio

解决方案


您正在打开此条件:(value != null),其评估结果为真或假。尽管如此,变量本身在 switch 表达式中仍然可以为null,因此该提示实际上是正确的。每当(value != null)的结果为false时,您仍然会进入 switch 主体,并且value将为 null。总之,无论value是否为null,都会执行switch body。

编辑:

从头到尾,我错了,你是对的。value在特定条件下不会为 null,尽管它在 switch 主体中可能为 null。你的 Visual Studio 有一些有趣的地方,这就是我得到的(我使用的是 VS 16.4.5),没有警告:

在此处输入图像描述


推荐阅读