Используя блоки в C# переключить выражение? - PullRequest
5 голосов
/ 14 января 2020

Мне не удалось найти документацию по этой проблеме. (возможно, я плохо использую 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()
};

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

Ответы [ 2 ]

9 голосов
/ 14 января 2020

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

Здесь достаточно ясно сказано :

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

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

{ someDir.Delete(); ... MoreActions} не является выражением.

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

Вы можете сделайте выражение переключения равным Action и вызовите это действие:

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

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

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

Но просто не делай этого ...

5 голосов
/ 14 января 2020

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

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

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