在switch表达式中使用多语句触发CS0201编译错误求助
解决C# switch表达式触发CS0201编译错误
错误原因
你写的switch表达式每个分支返回的是匿名lambda函数,但直接将整个表达式作为独立语句使用——C#规定,只有赋值、调用、增减量、新建对象这类表达式才能单独作为语句,而你当前只是定义了lambda却既没赋值给变量,也没执行它,因此触发CS0201错误。
另外你需要在每个分支写多条语句,甚至用到continue这类控制流,当前的lambda写法完全没必要,反而绕了弯路。
解决方案
方案1:改用switch语句(推荐,适配多语句+控制流场景)
这是多分支多语句场景下的常规写法,每个case里可以自由编写任意逻辑,包括continue这类控制语句:
switch (status) { case "ANY": checkboxUtils.TickCheckbox(name, status); break; case "true": if (!(bool)ChecksCkeckboxIsChecked(name, status)) checkboxUtils.TickCheckbox(name, status); break; case "false": if ((bool)ChecksCkeckboxIsChecked(name, status)) checkboxUtils.TickCheckbox(name, status); break; default: DriverContext.Driver.Wait(1); checkboxUtils.TickCheckbox(name, status); DriverContext.Driver.Wait(2); if (!(bool)ChecksCkeckboxIsChecked(name, status)) { testUtilsSteps.ThenUserRefreshesThePage(); continue; // 确保此代码处于循环内部,continue才能生效 } break; }
方案2:调整switch表达式写法(仅适合无控制流的场景)
如果一定要用switch表达式,需要将表达式结果赋值给变量(用_接收表示忽略返回值),同时去掉lambda,改用C# 9+支持的语句块表达式。注意:switch表达式中不能使用continue这类控制流语句,所以default分支的continue需要调整逻辑:
_ = status switch { "ANY" => { checkboxUtils.TickCheckbox(name, status); return null; // 语句块需要返回一个值,这里用null占位 }, "true" => { if (!(bool)ChecksCkeckboxIsChecked(name, status)) checkboxUtils.TickCheckbox(name, status); return null; }, "false" => { if ((bool)ChecksCkeckboxIsChecked(name, status)) checkboxUtils.TickCheckbox(name, status); return null; }, _ => { DriverContext.Driver.Wait(1); checkboxUtils.TickCheckbox(name, status); DriverContext.Driver.Wait(2); if (!(bool)ChecksCkeckboxIsChecked(name, status)) { testUtilsSteps.ThenUserRefreshesThePage(); // 此处不能用continue,若需要循环控制请改用switch语句 } return null; } };
内容的提问来源于stack exchange,提问作者user10829672
相关产品推荐
相关产品推荐

