【发布时间】:2017-08-28 09:39:17
【问题描述】:
假设我有 Base 和 Child1、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));
}
请注意,在注释行中,我不需要这些 child2、child3 变量,因为它的类型无关紧要,如果不是 child1。
Resharper 建议我可以安全地删除未使用的变量。有趣的部分来了。
-
我做不到:
case Child2: case Child3:因为它导致“类名此时无效”语法错误。
这种用法似乎最适合我。 -
我做不到:
case Child2 nevermind: case Child3 nevermind:因为它会导致“冲突变量”错误。顺便说一句,如果
ProcessAnyOther方法接受更精确的类型(Child2和Child3的基础)并且我用nevermind参数而不是b来调用它,则此语句将有意义。 -
但是,我可以这样做:
case Child2 _: case Child3 _:它甚至不创建“_”变量。 这正是 Resharper 建议的做法。
我的问题是:这是什么?还能用在什么地方?这个“_”运算符或语言部分是如何调用的?它是 C# 语言规范的一部分吗?
【问题讨论】:
-
这是一个“丢弃”的名称。它一直是 used unofficially for quite a while,但 C#7 在多种情况下使它成为官方的。
标签: c# pattern-matching c#-7.0