带有 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<string, string>
然后调用它,就像这样。
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 语句 [重复]的主要内容,如果未能解决你的问题,请参考以下文章