c#8无效方法的switch语句/表达式

问题描述 投票:2回答:1

我知道返回值或属性匹配的方法的c# 8 switch (statement/expression)语法。但是,如果我们只需要打开一个字符串值并执行一个不返回任何内容的方法(不返回类型/ void),那么我们该如何处理呢?我在想某种形式的Func,但不确定确切的语法。我知道我们可以使用常规的case语句以旧的方式完成此操作,但试图查看是否可以使用较新的语法实现相同的功能。

这是问题的例子

switch (stringvalue)
{
    case "Add": Add(); break;
    case "Subtract": Subtract(); break;
}

可能像:

stringvalue switch
{
    "Add" => Add(),
    "Subtract" => Subtract()
}
// but this complains that there needs to be assignment on left side for this

这可能吗?

c# switch-statement c#-8.0 switch-expression
1个回答
0
投票

这可能吗?

目前不可能。此限制在C# specification中描述。

请参考C# specification。从Recursive Pattern Matching - Switch ExpressionRecursive Pattern Matching - Switch Expression页,我们可以了解到:

  • Statements不允许作为Statements

  • switch_expression计算给定的表达式。由表达式计算的值(如果有)将被丢弃。

从这两个语句我们可以得出结论,expression_statement不能在expression_statement的上下文中使用,并且其结果值cannot将被丢弃。必须使用结果值,例如,必须将结果值分配给变量,将其作为参数传递给方法或作为方法的结果返回。因此,编译器抱怨switch_expression不能用作语句。


如果我们只需要打开一个字符串值并执行一个方法,什么都不返回(没有返回类型/ void),我们该如何处理?我是在考虑某种形式的Func,但不确定确切的语法。

我们可以使用下一种方法:编写一个expression_statement并返回一个switch expression,然后立即调用它。例如:

switch expression

此方法也可以用于声明delegate。这是(stringValue switch { "Add" => (Action) Add, "Subtract" => Subtract })();

我认为这样的解决方法看起来很丑陋,我个人希望使用expression bodied memberscomplete sample代替这样的结构。


[可能是在switch-case的未来版本中,此限制将被放宽(if-else):

我们正在考虑在将来的修订中放松这一点。

但是我在C#中找不到合适的建议。

© www.soinside.com 2019 - 2024. All rights reserved.