13

目前在 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;
}

有更好的方法吗?

4

1 回答 1

10

如果您不喜欢在当前区域中创建垃圾局部变量,则可以使用丢弃。那么您可以直接使用切换变量。如果切换变量是像对象或其他东西这样的超类,您可能需要额外的演员表。

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

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

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

于 2017-09-16T14:33:14.027 回答