模式匹配失败
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。
目前在 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。