C# 踩坑 CS8370:Switch Expression 在 C# 7.3 不可用及三种解决方案


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> 后用新语法

相关推荐
步步为营DotNet2 小时前
从分代预算到 DATAS:.NET GC 调优到底在调什么
c#·.net·内存管理·gc·datas
淡海水2 小时前
05-03-源码-Boehm GC分配与碎片管理
开发语言·算法·unity·c#·游戏引擎·gc
曹牧2 小时前
C#:字符串占位符与值数量不一致
开发语言·数据库·c#
玩泥巴的21 小时前
MAF + 飞书:让大模型干活,但别让它乱干
ai·c#·.net·飞书·agent
cpp_w1 天前
C#基础3- 面向对象中级应用3
后端·c#
步步为营DotNet1 天前
Async 状态机要搬进运行时了:.NET 10 Runtime Async 实测,快的地方快 1.5 倍,贵的地方贵 5 倍
性能优化·c#·.net·async·runtime
hixiong1231 天前
C# 使用 ZXingCpp.Angle 进行条码、二维码识别
开发语言·c#·扫码
步步为营DotNet1 天前
System.Text.Json 源生成:三个“看起来已经生效“的静默失效
c#·.net·native aot·源生成
用户788477316342 天前
用 C# 把每周 6 小时的 PDF 录入干到 20 分钟:一份可复制的桌面 OCR 方案
c#
csdn_aspnet2 天前
C# .NetCore Swagger ISchemaFilter 处理枚举、特殊类型
c#·.netcore·swagger