【发布时间】:2020-05-10 09:56:00
【问题描述】:
Switch 表达式是在 C# 8 中引入的。代码库中有很多地方可以用这种新风格重写。
例如,我有一些代码,用于从字节流中解析数据包:
switch (command)
{
case Command.C1:
return new P1();
case Command.C2:
return new P2();
default:
stream.Position++;
return null;
}
问题是 - 它不能转换成类似的 switch 表达式
return command switch
{
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => { stream.Position++; return null; }
};
我首先想到的是使用Func<>,它可以编译:
return command switch
{
Command.C1 => new P1(),
Command.C3 => new P2(),
_ => new Func<AbstractPacket>(() => { stream.Position++; return null; })()
};
F# 已经允许代码在每个分支中包含多个语句:
match command with
| Command.C1 -> Some(P1() :> AbstractPacket)
| Command.C2 -> Some(P2() :> AbstractPacket)
| _ ->
stream.Position <- stream.Position + 1
None
现在我无法使用 switch 语句,但是有没有任何选项可以将它写为 switch 表达式而没有任何奇怪的黑客攻击?
【问题讨论】:
-
Nitpick:“表达式”中没有那么多 S。
-
所以建议编辑?
-
就个人而言,在这种情况下,我会转换为
switch声明。也就是说,C# LDM 正在讨论一些选项以允许在switch表达式中使用语句,并且可能更普遍(“表达式块”)。这是我们最近审查的提案:github.com/dotnet/csharplang/issues/3086 -
switch 表达式并不意味着替换 switch 语句。它有不同的用途。它不会处理多个语句,也不应该处理,因为您只是打开一个值来评估正确的 single 表达式。所以你是完全正确的,让 switch 表达式来处理多个语句是一件很痛苦的事情,就像用锤子把一块木板一分为二一样。
-
我的评论放在一边,你到底想问什么?您是否有一个必须使用 switch 表达式但必须有语句的用例?或者这只是一个学术问题,比如“我怎样才能颠覆一个 switch 表达式来代替一个 switch 语句”?基本上,你想解决哪个问题?
标签: c# c#-8.0 switch-expression