3

刚刚查看了“新” C# 8.0 功能

所以我尝试重写以下代码

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

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

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

编译错误

如何用新语法重写它?

4

1 回答 1

3

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

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

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

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

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

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

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

于 2020-01-06T14:38:01.633 回答