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

相关推荐
离陌在学C#5 小时前
C# 事件(Event)详解:从概念到实战
开发语言·c#
rockey6277 小时前
C#脚本引擎之AScript与Flee对比
c#·.net·script·eval·动态脚本
zjnlswd13 小时前
C#学习笔记4
笔记·学习·c#
曹牧14 小时前
C#:List<string>特定格式输出
windows·c#
Z59981784115 小时前
c#软件开发学习笔记--Modbus-TCP/UDP网口通讯
笔记·学习·c#
曹牧16 小时前
C#:取的多个药品批准文号中的一个
c#
用户2986985301419 小时前
3 种方法,轻松将 PowerPoint 转换为 PDF 格式
人工智能·后端·c#
KindSuper_liu20 小时前
HybridCLR DHE及MetaVersion工作流核心概念
c#
淡海水20 小时前
01-08-运行时-虚方法分派与接口调用的底层实现
linux·windows·microsoft·c#·虚方法·vtable·vsd
李高钢20 小时前
C# WPF Prism 进阶(三):导航(Navigation)深入
开发语言·c#·wpf