Улучшение соответствия шаблону: переключатель шаблона - PullRequest
2 голосов
/ 06 января 2020

Только что взглянул на «новые» 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()
        };           
    }

Однако я получаю следующую ошибку компиляции:

В качестве оператора могут использоваться только выражения присваивания, вызова, приращения, уменьшения, ожидания и новых объектов.

Compile Error

Как мне переписать это в новом синтаксисе?

1 Ответ

2 голосов
/ 06 января 2020

Как указано в комментариях, новое сопоставление с образцом коммутатора ожидает возврата результата.

В F # , поскольку все является выражением, тип void на самом деле является допустимым типом возвращаемого значения для выражения, и это сработало бы.

В случае, аналогично вашему я думаю, что лучше использовать старый код, но если вы действительно хотите использовать новый синтаксис, вы можете сделать что-то вроде этого:

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

(это будет работать только если методы, которые вы используете для каждого случая выполняются одинаковые определения)

Хорошей практикой является использование исчерпывающего шаблона, поэтому я использую последний случай с подчеркиванием. В C# значения перечисления компилируются в целые числа, и даже если ваш переключатель обрабатывает все метки перечисления, компилятор все еще не знает, что вы обработали все случаи, и когда вы добавляете новую метку в перечисление, у вас не будет надлежащего предупреждения, что у вас есть необработанный регистр.

Каждый раз, когда вы используете перечисления, лучше использовать регистр по умолчанию, в который попадают все необработанные регистры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...