gpt4 book ai didi

c# - 使用 var/null 奇怪的行为进行切换

转载 作者:IT王子 更新时间:2023-10-29 03:37:10 26 4
gpt4 key购买 nike

给定以下代码:

string someString = null;
switch (someString)
{
case string s:
Console.WriteLine("string s");
break;
case var o:
Console.WriteLine("var o");
break;
default:
Console.WriteLine("default");
break;
}

为什么 switch 语句匹配 case var o

据我了解,当 s == null 时,case string s 不匹配,因为(有效地)(null as string) != null 的计算结果为 false。 VS Code 上的 IntelliSense 告诉我 o 也是一个 string。有什么想法吗?


类似于:C# 7 switch case with null checks

最佳答案

在模式匹配 switch 语句中,使用 case 显式类型是在询问所讨论的值是该特定类型还是派生类型。它完全等同于 is

switch (someString) {
case string s:
}
if (someString is string)

null 没有类型,因此不满足上述任一条件。 someString 的静态类型在这两个示例中都没有发挥作用。

虽然在模式匹配中 var 类型充当通配符,但会匹配任何值,包括 null

这里的default 是死代码。 case var o 将匹配任何值,null 或非 null。非默认情况总是胜过默认情况,因此 default 永远不会被命中。如果您查看 IL,您会发现它甚至没有发出。

乍一看,编译没有任何警告似乎很奇怪(绝对让我失望)。但这与可追溯到 1.0 的 C# 行为相匹配。编译器允许 default 情况,即使它可以简单地证明它永远不会被命中。考虑以下示例:

bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}

这里 default 永远不会被命中(即使是 bool 的值不是 1 或 0)。然而 C# 从 1.0 开始就在没有警告的情况下允许这样做。模式匹配只是符合这里的这种行为。

关于c# - 使用 var/null 奇怪的行为进行切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44532077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com