【问题标题】:C# 7.0 type pattern matching usage without variable没有变量的 C# 7.0 类型模式匹配用法
【发布时间】:2017-08-28 09:39:17
【问题描述】:

假设我有 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 变量,因为它的类型无关紧要,如果不是 child1
Resharper 建议我可以安全地删除未使用的变量。有趣的部分来了。

  1. 我做不到:

    case Child2:
    case Child3:
    

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

  2. 我做不到:

    case Child2 nevermind:
    case Child3 nevermind:
    

    因为它会导致“冲突变量”错误。顺便说一句,如果ProcessAnyOther 方法接受更精确的类型(Child2Child3 的基础)并且我用nevermind 参数而不是b 来调用它,则此语句将有意义。

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

    case Child2 _:
    case Child3 _:
    

    它甚至不创建“_”变量。 这正是 Resharper 建议的做法。

我的问题是:这是什么?还能用在什么地方?这个“_”运算符或语言部分是如何调用的?它是 C# 语言规范的一部分吗?

【问题讨论】:

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


【解决方案1】:

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

来自链接的文章:

Discards 是局部变量,可以赋值但不能读取。即它们是“只写”局部变量。它们没有名字,而是表示为_ 是上下文关键字,它与var 非常相似,而_ 无法读取(即不能出现在赋值的右侧。)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-29
    • 2017-11-28
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多