c# - 模式匹配失败

标签 c# switch-statement pattern-matching c#-7.0 fall-through

目前在 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;
}

有没有更好的方法?

最佳答案

如果你不想在当前区域创建垃圾局部变量,你可以使用丢弃。那么你可以直接使用切换变量。如果切换变量属于父类(super class),如对象或其他东西,您可能需要额外的转换。

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

我不知道模式匹配是如何编译的。如果它使用跳转表,那么这种方法也会更快一些。性能不是我关心的。这更具可读性。

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

关于c# - 模式匹配失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46255003/

相关文章:

c# - ObservableCollection 的网格 ObservableCollection 的网格

php - 在 PHP 5.5.9 的 PHP 开关中使用常量

erlang - 逗号和|之间的区别在二郎中

search - Quora 中的实时前缀匹配和自动完成

c - NULL 检查多个文件指针的最佳/最快方法?

java - 用 Java 中的等效字符替换 HTML 代码

c# - 使用 EDSDK 2.9 从佳能相机中检索图片

c# - 在 Entity Framework 中保存实体的通用方法

c# - 如何将图像插入 RichTextBox?

java - 我可以去掉这个开关和枚举吗?