带有 void 的 C# 8.0 switch 语句 [重复]

Posted

技术标签:

【中文标题】带有 void 的 C# 8.0 switch 语句 [重复]【英文标题】:C# 8.0 switch statement with void [duplicate] 【发布时间】:2020-12-01 04:27:38 【问题描述】:

我收到以下错误:Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement

public void LogClientSideErrors(string message, ValidationType validationType)
        => validationType switch
            
                ValidationType.Success => setInfo(message, controllerInfo),
                ValidationType.Critical => setFatal(message, controllerInfo),
                ValidationType.Error => setError(message, controllerInfo),
                ValidationType.Exception => setError(message, controllerInfo),
                ValidationType.Information => setInfo(message, controllerInfo),
                ValidationType.Warning => setWarn(message, controllerInfo),
                _ => setError("invalid enum value", controllerInfo),
            ; 

更新:工作解决方案:

internal static void GenerateLogs(string message, string controllerInfo, ValidationType validationType)
        => (validationType switch
        
            var x when x == ValidationType.Success || x == ValidationType.Information => new Action<string, string>(setInfo),
            ValidationType.Critical => setFatal,
            var x when x == ValidationType.Error || x == ValidationType.Exception => setError,
            ValidationType.Warning => setWarn,
            _ => (_, controllerInfo) => setError("invalid enum value", controllerInfo),
        )(message, controllerInfo);

【问题讨论】:

Switch 表达式是表达式:它们应该返回一个值。使用普通的 switch 语句可能会更好。这样,您也可以将您的案例分组在一起,例如case ValidationType.Success: case ValidationType.Information: setInfo(message, controllerInfo); break; 这就是我对案例进行分组的方式:validationType switch ValidationType.Critical => setFatal(message, controllerInfo), ValidationType.Exception | ValidationType.Error => setError(message, controllerInfo), ValidationType.Information | ValidationType.Success => setInfo(message, controllerInfo), ValidationType.Warning => setWarn(message, controllerInfo), _ => setError("invalid enum value", controllerInfo), ; 这并不像你认为的那样。这与“异常或错误”不匹配,它执行异常和错误的二进制或,然后查看validationType 是否等于那个值。和问validationType == (ValidationType.Exception | ValidationType.Error)一模一样 【参考方案1】:

switch 表达式期望您从每个分支返回一些内容,但您正在尝试运行 void 方法。您可以让这些方法返回一些内容,使用常规开关,或者您可以返回 Action&lt;string, string&gt; 然后调用它,就像这样。

public void LogClientSideErrors(string message, ValidationType validationType)
    => (validationType switch
        
            ValidationType.Success => new Action<string, string>(setInfo),
            ValidationType.Critical => setFatal,
            ValidationType.Error => setError,
            ValidationType.Exception => setError,
            ValidationType.Information => setInfo,
            ValidationType.Warning => setWarn,
            _ => (_, ci) => setError("invalid enum value", ci),
        )(message, controllerInfo);

【讨论】:

差不多但不完全。你需要validationType switch ... 周围的括号,并且你需要告诉编译器委托类型是什么。 See here controllerInfo 是一个字符串。谢谢你的协助。我更改了返回类型并且它起作用了。我尝试了您提供的修复程序,但它给出了以下错误:message and controllerinfo does not exsit in the current context (rephrased) 您能否分享更多实现细节或参考,因为我渴望了解更多关于它的信息。 @MuhammadHammadMaroof 正如 conton7 所提到的,这实际上需要整个 switch 表达式周围的括号,并且它需要一个选项来定义 Action 类型。

以上是关于带有 void 的 C# 8.0 switch 语句 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

c# 8.0 switch 表达式返回类型和空值

带有空检查的 C# 7 switch case

我可以使用带有两个变量的 case/switch 语句吗?

新的 C# 8.0 开关表达式的运算符优先级是啥?

C#各版本新增加功能

从 c# 代码调用带有 void *parameter 的本机 c++ 函数