M.k*_*ary 5 c# pattern-matching switch-statement fall-through c#-7.0
目前在c#7(版本15.3.4)中,以下代码对编译有效,但两个变量都是合法不可用的.
switch(fruit)
{
case Apple apple:
case Orange orange:
// impossible to use apple or orange
break;
case Banana banana:
break;
}
Run Code Online (Sandbox Code Playgroud)
如果您尝试使用它们,则会得到熟悉的错误,在访问之前可能无法初始化变量.
有时在模式匹配中,您不关心确切的类型,只要该类型属于您想要的类别.这里只以苹果和橘子为例.
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;
}
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?
如果您不想在当前区域中创建垃圾局部变量,则可以使用丢弃.那么你可以直接使用开关变量.如果切换变量是像对象或其他类似的超类,则可能需要额外的强制转换.
List<Fruit> applesAndOranges = new List<Fruit>();
switch(fruit)
{
case Apple _:
case Orange _:
applesAndOranges.Add(fruit);
break;
case Banana banana:
break;
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何编译模式匹配.如果它使用跳转表,那么这种方法也可以更快一些.虽然表现不是我关注的问题.这更具可读性.
我已经对这两种解决方案感到满意,所以这是我喜欢分享的问答帖子.
| 归档时间: |
|
| 查看次数: |
548 次 |
| 最近记录: |