【问题标题】:C# 8.0 switch statement with void [duplicate]带有 void 的 C# 8.0 switch 语句 [重复]
【发布时间】: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)一模一样

标签: c# c#-8.0 switch-expression


【解决方案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 类型。
猜你喜欢
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多