【问题标题】:Pattern Matching Enhancement: Switch Pattern模式匹配增强:切换模式
【发布时间】:2020-04-24 01:52:46
【问题描述】:

刚刚看了“新”C# 8.0 Features

所以我尝试重写以下代码

    private static void RunExample(ExampleCode exampleCode)
    {
        switch(exampleCode)
        {
            case ExampleCode.DefaultInterfaceMethod:
                RunDefaultInterfaceMethodExample();
                break;
            case ExampleCode.PatternMatchingEnhancements:
                RunPatternMatchingEnhancementsExample();
                break;
        }      
    }

到这里:

    private static void RunExample(ExampleCode exampleCode)
    {
        exampleCode switch
        {
            ExampleCode.DefaultInterfaceMethod => RunDefaultInterfaceMethodExample(),
            ExampleCode.PatternMatchingEnhancements => RunPatternMatchingEnhancementsExample()
        };           
    }

但是,我收到以下编译错误:

只有赋值、调用、递增、递减、等待和新建对象 表达式可以用作语句。

如何用新的语法重写它?

【问题讨论】:

  • 你用什么选项编译?那个突出的“显示潜在修复”暗示了什么?
  • @underscore_d .NET Core 3.0。潜在的修复显示字面上“没有”;-)
  • 由于错误指向你不能触发和忘记,这意味着新的模式匹配开关期望返回一些东西(这对于表达式来说很常见,它发生在 c# 不处理void 作为实际结果),如果您的情况是返回结果然后将结果分配给变量,那么您就可以了。
  • @vasiloreshenski 那你将如何巧妙地解决它?

标签: .net-core-3.0 c#-8.0 switch-expression


【解决方案1】:

正如 cmets 中所指出的,新的基于开关的模式匹配期望返回结果。

F# 中,因为一切都是表达式,void 类型实际上是表达式的有效返回类型,这会起作用。

如果像你这样,我认为最好使用旧代码,但如果你真的想使用新语法,你可以这样做:

Action methodToExecute = exampleCode switch
{
  ExampleCode.DefaultInterfaceMethod => RunDefaultInterfaceMethodExample,
  ExampleCode.PatternMatchingEnhancements => RunPatternMatchingEnhancementsExample,
  _ => throw new NotImplementedException()
};     
methodToExecute();

(仅当您为每种情况执行的方法具有相同定义时才有效)

使用穷举模式是一种很好的做法,这就是我使用带下划线的最后一种情况的原因。 在 C# 中,枚举值被编译为整数,即使您的开关处理了所有枚举标签,编译器仍然不知道您已经处理了所有情况,并且当您向枚举添加新标签时,您不会得到适当的警告,即您有未处理的情况.

每当您使用枚举时,最好使用默认情况,所有未处理的情况都将落入其中。

【讨论】:

  • 所以和预期的一样。然后我会明确地坚持旧代码。感谢您的宝贵时间!
  • @FabianBigler 是的,最好的办法:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
相关资源
最近更新 更多