C# 踩坑 CS8370:Switch Expression 在 C# 7.3 不可用及三种解决方案
报错信息:
CS8370: 功能"递归模式"在 C# 7.3 中不可用。请使用 8.0 或更高的语言版本。
这是很多从网上复制 switch 表达式代码到 .NET Framework(默认 C# 7.3) 项目时常遇到的编译错误。本文讲清原因并提供三种标准解法。
一、触发错误的代码
csharp
// ❌ C# 8.0+ 才支持 ------ 在 C# 7.3 / .NET Framework 默认项目中会报 CS8370
return strength switch
{
"强" => Colors.Green,
"中" => Colors.Orange,
_ => Colors.Red
};
关键点:switch 表达式(Switch Expression)是 C# 8.0 引入的特性 ,而 .NET Framework 项目默认语言版本为 C# 7.3,编译器完全不认识该语法。
报错提示中的"递归模式(Recursive Patterns)"是编译器内部归类,对你来说本质就是:用了 C# 8.0 语法,但项目只认 C# 7.3。
二、解决方案一:降级写法 → 传统 switch 语句(C# 7.3 兼容 ✅)
适合不能改项目设置的遗留系统(.NET Framework 4.5~4.8 企业项目)。
csharp
private Color GetStrengthColor(string strength)
{
switch (strength)
{
case "强":
return Colors.Green;
case "中":
return Colors.Orange;
default:
return Colors.Red;
}
}
✔ 零依赖
✔ 所有 C# 版本支持
✔ 最稳妥的生产代码写法
三、解决方案二:升级语言版本到 C# 8.0+(推荐新项目 ✅)
如果你的运行时支持(.NET Core 3.1+ / .NET 5+ 或 .NET Framework 如 4.8 且装了 VS2019+),直接升语言版本:
方法 A:编辑 .csproj
xml
<PropertyGroup>
<TargetFramework>net48</TargetFramework> <!-- 或 net6.0 / net8.0 -->
<LangVersion>latest</LangVersion> <!-- 或 8.0 / 9.0 -->
</PropertyGroup>
.NET Core 3.1+ 默认已是 C# 8.0;.NET Framework 需手动加
LangVersion。
方法 B:Visual Studio GUI
项目属性 → 生成(Build) → 高级(Advanced...) → 语言版本选 C# 8.0 / Latest Major
设置后原 switch 表达式可直接编译通过。
四、解决方案三:用 Dictionary / if-else(特殊场景)
适合简单映射、配置驱动场景:
csharp
private static readonly Dictionary<string, Color> StrengthColorMap = new()
{
["强"] = Colors.Green,
["中"] = Colors.Orange
};
Color GetColor(string s)
=> StrengthColorMap.TryGetValue(s, out var c) ? c : Colors.Red;
优点是可外部化配置;缺点是缺少穷尽性检查。
五、C# 版本与 .NET Framework 默认关系速查
| 目标框架 | 默认 C# 语言版本 |
|---|---|
| .NET Framework 2.0 ~ 4.8 | 7.3 |
| .NET Core 2.x | 7.3 |
| .NET Core 3.x | 8.0 |
| .NET 5 | 9.0 |
| .NET 6 | 10.0 |
| .NET 8 | 12.0 |
若你不指定
<LangVersion>,编译器按上表给默认值。
六、一句话总结
- CS8370 的本质 :你用了 C# 8.0 的
switch表达式 / 递归模式,但项目是 C# 7.3- 老项目 / 不能升级 → 改用传统
switch语句(最稳)- 新项目 / 可控环境 →
.csproj中设<LangVersion>latest</LangVersion>后用新语法