目前在 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;
}
有更好的方法吗?
如果您不喜欢在当前区域中生成垃圾局部变量,则可以使用 Discards。然后就可以直接使用switched变量了。如果切换变量是超类(如对象或其他东西),则可能需要额外的转换。
List<Fruit> applesAndOranges = new List<Fruit>();
switch(fruit)
{
case Apple _:
case Orange _:
applesAndOranges.Add(fruit);
break;
case Banana banana:
break;
}
我不知道模式匹配是如何编译的。如果它使用跳转表,那么这种方法也可能会更快一点。不过,性能不是我关心的。这更具可读性。
我已经对这两种解决方案感到满意,所以这是我想分享的问答帖子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)