模式匹配中的下降
问题描述:
目前在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;
}
有没有更好的方法?
答
如果您不想在当前区域生成垃圾本地变量,则可以使用丢弃。那么你可以直接使用开关变量。如果开关变量是像对象或其他东西那样的超类,你可能需要额外的强制转换。
List<Fruit> applesAndOranges = new List<Fruit>();
switch(fruit)
{
case Apple _:
case Orange _:
applesAndOranges.Add(fruit);
break;
case Banana banana:
break;
}
我不知道如何编译模式匹配。如果它使用跳转表,那么这种方法可能会更快一些。性能不是我关心的。这更可读。
我对这两种解决方案都很满意,所以这是Q &我喜欢分享的帖子。