没有变量

时间:2017-08-28 09:39:17

标签: c# pattern-matching c#-7.0

假设我有BaseChild1Child2Child3类,我有以下代码:

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));
}

请注意,在注释行中,我不需要这些child2child3个变量,因为它不具有什么类型,如果它不是{{1} }。
Resharper建议我可以安全地删除未使用的变量。这是有趣的部分。

  1. 我做不到:

    child1

    因为它导致&#34;类名在此时无效&#34;语法错误 这种用法似乎最适合我。

  2. 我做不到:

    case Child2:
    case Child3:
    

    因为它会导致&#34;冲突的变量&#34;错误。顺便说一下,如果case Child2 nevermind: case Child3 nevermind: 方法接受更精确的类型(ProcessAnyOtherChild2的基础)并且我使用Child3参数而不是{{nevermind调用它,则此语句将有意义1}}。

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

    b

    它甚至没有创造&#34; _&#34;变量。 这正是Resharper建议做的事情。

  4. 我的问题是:这是什么?还可以在哪里使用它?这是怎么回事?&#34; _&#34;运营商或语言部分叫什么?它是C#语言规范的一部分吗?

1 个答案:

答案 0 :(得分:7)

它被称为discard,是的,它是C#7规范的一部分。

来自链接文章:

  

丢弃是您可以分配但无法读取的本地变量。即它们是“只写”局部变量。它们没有名称,相反,它们表示为_是一个上下文关键字,它与var非常相似,_无法读取(即不能出现在右侧)任务。)

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