模式匹配失败

Fall through in pattern matching

目前在 c#7(版本 15.3.4)中,以下代码可有效编译,但两个变量都合法地无法使用。

switch(fruit)
{
    case Apple apple:
    case Orange orange:
    // impossible to use apple or orange
    break;
    case Banana banana:
    break;
}

如果您尝试使用它们,您会遇到熟悉的错误,变量可能在访问之前未初始化。

有时在模式匹配中您并不关心确切的类型,只要该类型在您想要的类别中即可。这里仅以苹果和橙子为例

List<Fruit> applesAndOranges = new List<Fruit>();
switch(fruit)
{
    case Fruit X when X is Apple || X is Orange:
    applesAndOranges.Add(X);
    break;
    case Banana banana:
    break;
}

有没有更好的方法?

如果你不想在当前区域创建垃圾局部变量,你可以使用丢弃。那么你可以直接使用切换变量。如果 switched 变量是 super class like object 或其他东西,你可能需要额外的转换。

List<Fruit> applesAndOranges = new List<Fruit>();
switch(fruit)
{
    case Apple _:
    case Orange _:
    applesAndOranges.Add(fruit);
    break;
    case Banana banana:
    break;
}

我不知道模式匹配是如何编译的。如果它使用跳转表,那么这种方法也会更快一些。性能不是我关心的。这更具可读性。

我已经对这两种解决方案感到满意,所以这是我想分享的问答 post。