C#7.0类型模式匹配用法没有变量

Yel*_*yev 7 c# pattern-matching c#-7.0

假设我有BaseChild1,Child2,Child3班,我有以下代码:

Base b; // value is acquired
switch (b) 
{
    case Child1 child1:
        ProcessChild1(child1);
        break;

    case Child2 child2:
    case Child3 child3:
        ProcessAnyOther(b); // <--
        break;

    default:
        throw new ArgumentOutOfRangeException(nameof(b));
}
Run Code Online (Sandbox Code Playgroud)

请注意,在注释行,我不需要这些child2,child3因为它不不管什么类型的变量,如果它不是child1.
Resharper建议我可以安全地删除未使用的变量.这是有趣的部分.

  1. 我不能这样做:

    case Child2:
    case Child3:
    
    Run Code Online (Sandbox Code Playgroud)

    因为它导致"类名在此时无效"语法错误.
    这种用法似乎最适合我.

  2. 我不能这样做:

    case Child2 nevermind:
    case Child3 nevermind:
    
    Run Code Online (Sandbox Code Playgroud)

    因为它导致"冲突的变量"错误.顺便说一下,如果ProcessAnyOther方法接受了更精确的类型(base for Child2Child3),并且我用nevermind参数而不是语句调用它,那么这个语句就有意义了b.

  3. 但是,我可以这样做:

    case Child2 _:
    case Child3 _:
    
    Run Code Online (Sandbox Code Playgroud)

    它甚至没有创建"_"变量.这正是Resharper建议做的事情.

我的问题是:这是什么?还可以在哪里使用它?这个"_"运算符或语言部分是如何调用的?它是C#语言规范的一部分吗?

Ren*_*ogt 7

它被称为丢弃,是的,它是C#7规范的一部分.

来自链接的文章:

丢弃是您可以分配但无法读取的局部变量.即它们是"只写"局部变量.他们没有名字,相反,它们被表示为_是一个上下文关键字,它非常类似于var和_不能被读取(即不能出现在赋值的右边).

通过命名变量,_您告诉编译器您将永远不会再次访问此变量,因此它可以忽略您在前两个版本中遇到的问题.