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

相关推荐
z落落3 小时前
C# ToCharArray + foreach遍历 + String与StringBuilder
开发语言·c#
xiaoshuaishuai84 小时前
C# AvaloniaUI动态显示图片
开发语言·c#
csdn_aspnet7 小时前
EasyModbus 与 C# 集成
c#·modbus·easymodbus
JaydenAI9 小时前
[MAF预定义ChatClient中间件-06]利用ImageGeneratingChatClient开发专业图片生成Agent
ai·c#·agent·agent管道·chatclient中间件·chatclient管道
csdn_aspnet10 小时前
Modbus TCP C# 客户端程序
服务器·网络·tcp/ip·c#
0x000711 小时前
译 Anders Hejlsberg 谈 C# 与 .NET
开发语言·c#·.net
Xin_ye1008611 小时前
C# 零基础到精通教程 - 第十七章:前端集成——Blazor 基础
开发语言·c#
daopuyun11 小时前
《C#语言源代码漏洞测试规范》解读,如何依据GB/T 34946-2017标准建立代码测试技术体系
c#·代码测试·源代码安全检测