【问题标题】:In a case statement, what is mutually exclusive values?在 case 语句中,什么是互斥值?
【发布时间】:2019-11-25 12:03:51
【问题描述】:

最近我打算潜入 C# 并来自 Java 背景。 当我来switch-case主题复习时,我看到了以下术语。

因为 C# 6 只支持常量模式并且不允许 常量值的重复,案例标签定义互斥 值,并且只有一种模式可以匹配匹配表达式。作为一个 因此,case 语句出现的顺序并不重要。

然而,在 C# 7.0 中,由于支持其他模式,case 标签不需要定义互斥值,并且多个 模式可以匹配匹配表达式。因为只有语句 在包含匹配模式的第一个开关部分是 执行时,case 语句出现的顺序现在很重要。 如果 C# 检测到一个或多个 case 语句为 等价于或是先前语句的子集,它会生成一个 编译器错误,CS8120,“开关情况已由 前一个案例。” - Source

在这方面互斥值是什么意思?您能否举例说明相互排斥和非相互排斥的价值观?

【问题讨论】:

标签: c# .net


【解决方案1】:

这是一个简单的例子 (fiddle):

object o = "text";

switch (o)
{
    case string s:
        break;
    case "text":
        break;
}

o 既是字符串(导致第一个 case 块匹配)又等于 "text"(导致第二个 case 块匹配)。因此,这两个案例标签并不相互排斥。

由于第二个是第一个的子集(每个 "text" 都是一个字符串),因此您会收到问题中提到的编译器错误(“开关案例已由前一个案例处理。”)。您收到此错误是因为第二个 case 块是无法访问的代码,因此编译器推断这可能不是您想要的。

请注意,交换两个标签在没有编译时错误的情况下工作:

switch (o)
{
    case "text":
        break;
    case string s:
        break;
}

在这种情况下,第一个 case 块处理o == "text" 的情况,第二个覆盖所有其他字符串。它们仍然不是相互排斥的,但你先有更具体的,这没关系。

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多