开关表达式中的多个语句:C#8

开关表达式中的多个语句:C#8,c#,c#-8.0,switch-expression,C#,C# 8.0,Switch Expression,开关表达式是在C#8中引入的。在代码库中有很多地方,可以用这种新风格重写 例如,我有一些代码,用于解析字节流中的数据包: 开关(命令) { case Command.C1: 返回新的P1(); case Command.C2: 返回新的P2(); 违约: stream.Position++; 返回null; } 问题是-它不能转换为像这样的开关表达式 返回命令开关 { Command.C1=>new P1(), Command.C3=>newp2(), _=>{stream.Position+

开关表达式是在C#8中引入的。在代码库中有很多地方,可以用这种新风格重写

例如,我有一些代码,用于解析字节流中的数据包:

开关(命令)
{
case Command.C1:
返回新的P1();
case Command.C2:
返回新的P2();
违约:
stream.Position++;
返回null;
}
问题是-它不能转换为像这样的开关表达式

返回命令开关
{
Command.C1=>new P1(),
Command.C3=>newp2(),
_=>{stream.Position++;返回null;}
};
我想到的第一件事是使用
Func
,它编译:

返回命令开关
{
Command.C1=>new P1(),
Command.C3=>newp2(),
_=>newfunc(()=>{stream.Position++;返回null;})()
};
F#已经允许在每个分支中使用多个语句的代码:

将命令与
|Command.C1->Some(P1():>AbstractPacket)
|Command.C2->Some(P2():>AbstractPacket)
| _ ->

stream.Position您唯一支持的选择是像您一样的func。有关更多信息,请参阅。他的例子是:

var result = operation switch
{
"+" => ((Func<int>)(() => {
    Log("addition");
    return a + b;
}))(),
"-" => ((Func<int>)(() => {
    Log("subtraction");
    return a - b;
}))(),
"/" => ((Func<int>)(() => {
    Log("division");
    return a / b;
}))(),
_ => throw new NotSupportedException()
};
var结果=操作开关
{
“+”=>((Func)(()=>{
日志(“添加”);
返回a+b;
}))(),
“-”=>((函数)(()=>{
对数(“减法”);
返回a-b;
}))(),
“/”=>((Func)(()=>{
日志(“分割”);
返回a/b;
}))(),
_=>抛出新的NotSupportedException()
};
仅仅因为开关表达式是新的并不意味着它们对所有用例都是最好的。它们不是为包含多个命令而设计的。

带有:

TRes调用(Func f)=>f();
它看起来像:

返回命令开关{
Command.C1=>new P1(),
Command.C3=>newp2(),
_=>调用(()=>{stream.Position++;返回null;}),
};
或:

var结果=操作开关{
“+”=>呼叫(()=>{
日志(“添加”);
返回a+b;
}),
“-”=>呼叫(()=>{
对数(“减法”);
返回a-b;
}),
“/”=>呼叫(()=>{
日志(“分割”);
返回a/b;
}),
_=>抛出新的NotSupportedException(),
};

吹毛求疵:“表达式”中没有那么多的S。因此建议进行编辑?就我个人而言,在这种情况下,我会转换为
开关
语句。也就是说,C#LDM正在讨论一些选项,以允许
switch
表达式中的语句,以及可能更一般的(“表达式块”)。下面是我们最近审查的建议:switch表达式并不是要替换switch语句。它有不同的用途。它不会处理多个语句,也不应该处理多个语句,因为您只需打开一个值来计算正确的单个表达式。所以你是完全正确的,让switch表达式处理多个语句是一件痛苦的事情,就像用锤子把木板一分为二一样。撇开我上面的评论不谈,你到底在问什么?您是否有一个必须使用switch表达式但必须有语句的用例?或者这只是一个学术性的问题,比如“我怎样才能颠覆一个switch表达式来代替switch语句”?基本上,您要解决的问题是什么?“它不是为包含多个命令而设计的。”而且肯定不是更可读的。@Jeroen van Langen这是今年最保守的说法。这实际上与javascript事件函数非常相似。它们是为一次调用而设计的,但您可以在其中嵌入函数。通常,如果答案中包含对代码意图的解释,以及在不引入其他代码的情况下解决问题的原因,那么答案会更有帮助。