Использование блоков в выражении переключателя C#?

Мне не удалось найти документацию по этой проблеме. (возможно, я просто плохо использую Google...) Я предполагаю, что ответ отрицательный, однако я не понял, где это рассматривается в документации. Если быть точным, у меня следующий вопрос.

Предположим, я хочу выполнить что-то вроде этого:

DirectoryInfo someDir = new DirectoryInfo(@".\someDir");
Console.WriteLine($"Would you like to delete the directory {someDir.FullName}?");
string response = Console.ReadLine().ToLower();

response switch
{
    "yes" => { someDir.Delete(); ... MoreActions},
     _ => DoNothing()
};

Я понимаю, что могу добиться желаемого поведения с помощью обычного переключателя или if/else, однако мне было любопытно, можно ли в этом случае использовать выражение переключения.

4 ответа

Решение

однако я не понял, где это рассматривается в документации

Об этом говорится довольно ясно здесь:

Здесь есть несколько улучшений синтаксиса:

  • Переменная стоит перед ключевым словом switch. Различный порядок позволяет визуально легко отличить выражение switch от оператора switch.
  • Элементы case и: заменяются на =>. Это более лаконично и интуитивно понятно.
  • Регистр по умолчанию заменяется на _ discard.
  • Тела - это выражения, а не утверждения.

{ someDir.Delete(); ... MoreActions} это не выражение.

Однако, как говорится, можно злоупотреблять любой функцией:)

Вы можете заставить выражение switch оцениватьAction, и вызвать это действие:

Action a = response switch
{
    "yes" => () => { ... },
     _ => () => { .... }
};
a();

Вы даже можете сократить это до одного оператора:

(response switch
{
    "yes" => (Action)(() => { ... }),
     _ => () => { ... }
})();

Но только не делай этого...

Вы также можете ввести локальную функцию (C# 7.0 и выше) и сделать что-то вроде:

      response switch
{
    "yes" => DoSomething(),
     _ => DoNothing()
};

void DoSomething()
{
    someDir.Delete();
    ... MoreActions
}

Согласно документации: тела - это выражения, а не утверждения.

Вы можете сделать что-то вроде этого:

Action fn = response switch
{
    "yes" => () => { BlockTest(); },
     _ => () => { OldTest(); }
};

Я думаю, что эта функция будет там очень скоро. Предложение для этого

Другие вопросы по тегам