.NET Web项目C#7 switch模式匹配编译错误排查与解决
.NET Web应用中C#7模式匹配switch语句编译报错的解决
问题场景
我有一个目标框架为.NET 4.7的Web应用,原本通过if/else判断传入消息是否包含特定字符串,想改用带模式匹配的switch语句——这段代码在另一个目标框架为.NET 4.5.2的Windows服务项目中能正常编译运行:
switch (message) { case "SomeString": ... break; case var b when b.Contains("AnotherString"): // 报错行 .... break; }
编译错误信息
Web应用编译时,上述报错行触发一系列语法错误:
Error CS1002 ; expected Error CS1002 ; expected Error CS1003 Syntax error, ':' expected Error CS1513 } expected
排查过程
- 按常规认知,C#版本依赖目标.NET框架,但将Web应用目标框架改为.NET 4.5.2后,问题依旧存在;
- 尝试将C#版本从“最新主版本”改为7.0时,出现新的编译错误;
- 使用VS2017,手动在.csproj中添加
<LangVersion>7</Langversion>或在VS生成设置中指定C#7,触发如下错误:
Error CS1617 Invalid option '7' for /langversion; must be ISO-1, ISO-2, Default or an integer in range 1 to 6.
最终解决方法
- 删除.csproj文件中旧的DotNetCompilers 1.0.0引用,保留4.2.0版本;
- 复制其他可正常编译C#7特性项目的
roslyn/csc文件夹到当前Web应用的bin目录; - 将项目的LangVersion设置为6;
完成以上操作后,C#7特性(包括上述带when条件的switch语句)均可正常编译运行。
内容的提问来源于stack exchange,提问作者id10t
相关产品推荐
相关产品推荐

