繁体   English   中英

落在模式匹配中

[英]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;
}

有更好的方法吗?

如果您不想在当前区域中创建垃圾局部变量,则可以使用丢弃。 那么你可以直接使用开关变量。 如果切换变量是像对象或其他类似的超类,则可能需要额外的强制转换。

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

我不知道如何编译模式匹配。 如果它使用跳转表,那么这种方法也可以更快一些。 虽然表现不是我关注的问题。 这更具可读性。

我已经对这两种解决方案感到满意,所以这是我喜欢分享的问答帖子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM