2017-09-16 58 views
2

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

如果您不想在当前区域生成垃圾本地变量,则可以使用丢弃。那么你可以直接使用开关变量。如果开关变量是像对象或其他东西那样的超类,你可能需要额外的强制转换。

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

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

我对这两种解决方案都很满意,所以这是Q &我喜欢分享的帖子。