8

我找不到解决此问题的文档。(也许我只是不擅长使用谷歌......)我的猜测是答案是否定的,但是我不明白文档中的哪个地方解决了这个问题。确切地说,我的问题如下。

假设,我想执行这样的事情:

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 来实现所需的行为,但是我很好奇在这种情况下是否可以使用 switch 表达式。

4

4 回答 4

14

但是我不明白文档中的哪个位置

这在这里说得很清楚:

这里有几个语法改进:

  • 该变量位于 switch 关键字之前。不同的顺序使得在视觉上很容易区分 switch 表达式和 switch 语句。
  • case 和 : 元素被替换为 =>。它更加简洁和直观。
  • 默认情况被替换为 _ 丢弃。
  • 主体是表达式,而不是语句。

{ someDir.Delete(); ... MoreActions}不是表达式。

但是,正如他们所说,您可以滥用每个功能:)

可以使 switch 表达式计算为Action,并调用该操作:

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

您甚至可以将其简化为一条语句:

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

但是不要这样做...

于 2020-01-14T07:59:21.993 回答
6

根据文档:正文是表达式,而不是语句。

你可以做这样的事情:

Action fn = response switch
{
    "yes" => () => { BlockTest(); },
     _ => () => { OldTest(); }
};
于 2020-01-14T07:59:53.217 回答
3

您还可以引入本地函数(C# 7.0 及更高版本)并执行以下操作:

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

void DoSomething()
{
    someDir.Delete();
    ... MoreActions
}
于 2021-06-30T17:13:04.790 回答
0

我认为这个功能很快就会出现。对此的提议

于 2021-12-26T04:08:04.770 回答