当前位置: 首页 > article >正文

功能“递归模式”在 C# 7.3 中不可用,请使用 8.0 或更高的语言版本的一种兼容处理方案

原程序:

internal class ControllerParameterCreator : IParameterCreator
{private Controller controller;public ControllerParameterCreator(Controller controller){this.controller = controller;}public Parameter CreateSystem(string name, int unused){return ParameterInfoProvider.GetType(name) switch{PrimitiveType.Double => new ControllerParameter<double>(controller, name, PrimitiveType.Double),PrimitiveType.Integer => new ControllerParameter<int>(controller, name, PrimitiveType.Integer),PrimitiveType.Long => new ControllerParameter<long>(controller, name, PrimitiveType.Long),PrimitiveType.Single => new ControllerParameter<float>(controller, name, PrimitiveType.Single),PrimitiveType.String => new ControllerParameter<string>(controller, name, PrimitiveType.String),_ => null,};}public Parameter CreateAxis(string name, int index){return ParameterInfoProvider.GetType(name) switch{PrimitiveType.Double => new ControllerParameter<double>(controller, name, PrimitiveType.Double, ParameterContext.Axis, index),PrimitiveType.Integer => new ControllerParameter<int>(controller, name, PrimitiveType.Integer, ParameterContext.Axis, index),PrimitiveType.Long => new ControllerParameter<long>(controller, name, PrimitiveType.Long, ParameterContext.Axis, index),PrimitiveType.Single => new ControllerParameter<float>(controller, name, PrimitiveType.Single, ParameterContext.Axis, index),PrimitiveType.String => new ControllerParameter<string>(controller, name, PrimitiveType.String, ParameterContext.Axis, index),_ => null,};}public Parameter CreateTask(string name, int task){return ParameterInfoProvider.GetType(name) switch{PrimitiveType.Double => new ControllerParameter<double>(controller, name, PrimitiveType.Double, ParameterContext.Task, task),PrimitiveType.Integer => new ControllerParameter<int>(controller, name, PrimitiveType.Integer, ParameterContext.Task, task),PrimitiveType.Long => new ControllerParameter<long>(controller, name, PrimitiveType.Long, ParameterContext.Task, task),PrimitiveType.Single => new ControllerParameter<float>(controller, name, PrimitiveType.Single, ParameterContext.Task, task),PrimitiveType.String => new ControllerParameter<string>(controller, name, PrimitiveType.String, ParameterContext.Task, task),_ => null,};}
}

处理后程序:

internal class ControllerParameterCreator : IParameterCreator
{private Controller controller;public ControllerParameterCreator(Controller controller){this.controller = controller;}public Parameter CreateSystem(string name, int unused){
#if CSHARP_8_OR_NEWER// C# 8.0+ 递归模式写法return ParameterInfoProvider.GetType(name) switch{PrimitiveType.Double => new ControllerParameter<double>(controller, name, PrimitiveType.Double),PrimitiveType.Integer => new ControllerParameter<int>(controller, name, PrimitiveType.Integer),PrimitiveType.Long => new ControllerParameter<long>(controller, name, PrimitiveType.Long),PrimitiveType.Single => new ControllerParameter<float>(controller, name, PrimitiveType.Single),PrimitiveType.String => new ControllerParameter<string>(controller, name, PrimitiveType.String),_ => null,};
#else// C# 7.3 传统 switch 写法PrimitiveType type = ParameterInfoProvider.GetType(name);switch (type){case PrimitiveType.Double:return new ControllerParameter<double>(controller, name, PrimitiveType.Double);case PrimitiveType.Integer:return new ControllerParameter<int>(controller, name, PrimitiveType.Integer);case PrimitiveType.Long:return new ControllerParameter<long>(controller, name, PrimitiveType.Long);case PrimitiveType.Single:return new ControllerParameter<float>(controller, name, PrimitiveType.Single);case PrimitiveType.String:return new ControllerParameter<string>(controller, name, PrimitiveType.String);default:return null;}
#endif}public Parameter CreateAxis(string name, int index){
#if CSHARP_8_OR_NEWERreturn ParameterInfoProvider.GetType(name) switch{PrimitiveType.Double => new ControllerParameter<double>(controller, name, PrimitiveType.Double, ParameterContext.Axis, index),PrimitiveType.Integer => new ControllerParameter<int>(controller, name, PrimitiveType.Integer, ParameterContext.Axis, index),PrimitiveType.Long => new ControllerParameter<long>(controller, name, PrimitiveType.Long, ParameterContext.Axis, index),PrimitiveType.Single => new ControllerParameter<float>(controller, name, PrimitiveType.Single, ParameterContext.Axis, index),PrimitiveType.String => new ControllerParameter<string>(controller, name, PrimitiveType.String, ParameterContext.Axis, index),_ => null,};
#elsePrimitiveType type = ParameterInfoProvider.GetType(name);switch (type){case PrimitiveType.Double:return new ControllerParameter<double>(controller, name, PrimitiveType.Double, ParameterContext.Axis, index);case PrimitiveType.Integer:return new ControllerParameter<int>(controller, name, PrimitiveType.Integer, ParameterContext.Axis, index);case PrimitiveType.Long:return new ControllerParameter<long>(controller, name, PrimitiveType.Long, ParameterContext.Axis, index);case PrimitiveType.Single:return new ControllerParameter<float>(controller, name, PrimitiveType.Single, ParameterContext.Axis, index);case PrimitiveType.String:return new ControllerParameter<string>(controller, name, PrimitiveType.String, ParameterContext.Axis, index);default:return null;}
#endif}public Parameter CreateTask(string name, int task){
#if CSHARP_8_OR_NEWERreturn ParameterInfoProvider.GetType(name) switch{PrimitiveType.Double => new ControllerParameter<double>(controller, name, PrimitiveType.Double, ParameterContext.Task, task),PrimitiveType.Integer => new ControllerParameter<int>(controller, name, PrimitiveType.Integer, ParameterContext.Task, task),PrimitiveType.Long => new ControllerParameter<long>(controller, name, PrimitiveType.Long, ParameterContext.Task, task),PrimitiveType.Single => new ControllerParameter<float>(controller, name, PrimitiveType.Single, ParameterContext.Task, task),PrimitiveType.String => new ControllerParameter<string>(controller, name, PrimitiveType.String, ParameterContext.Task, task),_ => null,};
#elsePrimitiveType type = ParameterInfoProvider.GetType(name);switch (type){case PrimitiveType.Double:return new ControllerParameter<double>(controller, name, PrimitiveType.Double, ParameterContext.Task, task);case PrimitiveType.Integer:return new ControllerParameter<int>(controller, name, PrimitiveType.Integer, ParameterContext.Task, task);case PrimitiveType.Long:return new ControllerParameter<long>(controller, name, PrimitiveType.Long, ParameterContext.Task, task);case PrimitiveType.Single:return new ControllerParameter<float>(controller, name, PrimitiveType.Single, ParameterContext.Task, task);case PrimitiveType.String:return new ControllerParameter<string>(controller, name, PrimitiveType.String, ParameterContext.Task, task);default:return null;}
#endif}
}

关键实现说明

  1. 条件编译符号

    • 使用 #if CSHARP_8_OR_NEWER 和 #else 隔离不同版本的语法。

    • 需在项目文件中定义符号(见下方配置步骤)。

  2. 版本差异处理

    • C# 8.0+:使用简洁的递归模式匹配(switch 表达式)。

    • C# 7.3:回退到传统的 switch-case 语句。

  3. 功能一致性
    两种写法的逻辑完全一致,仅语法形式不同。


项目配置步骤

  1. 定义编译符号
    在 .csproj 文件中根据语言版本自动设置符号:

<PropertyGroup><!-- 当使用 C# 8.0+ 时自动定义符号 --><DefineConstants Condition="'$(LangVersion)' >= '8.0'">CSHARP_8_OR_NEWER</DefineConstants>
</PropertyGroup>

 手动指定版本(可选)
若需强制兼容性,可手动设置语言版本:

<PropertyGroup><LangVersion>7.3</LangVersion> <!-- 或 8.0、latest 等 -->
</PropertyGroup>

优点

  • 无缝适配:根据项目语言版本自动选择最优语法。

  • 维护友好:升级到 C# 8.0+ 时无需修改代码,直接享受新语法。

  • 编译安全:避免因版本不兼容导致的编译错误。

http://www.lryc.cn/news/2386593.html

相关文章:

  • 第4章-操作系统知识
  • 将网页带格式转化为PDF
  • 【ArcGIS】ArcGIS AI 助手----复现
  • 使用 FFmpeg 将视频转换为高质量 GIF(保留原始尺寸和帧率)
  • 《Java vs Go vs C++ vs C:四门编程语言的深度对比》
  • 充电枪IEC62196/EN 62196测试内容
  • 有效的字母异位符--LeetCode
  • SAP ERP 系统拆分的七大挑战
  • AcrelEMS 3.0智慧能源管理平台:构建企业微电网数智化中枢
  • 【HTML-12】HTML表格常用属性详解:从基础到高级应用
  • Word转PDF--自动生成目录
  • MySQL组合索引优化策略
  • Spring MVC 的的核心原理与实践指南
  • 轻量级视觉语言模型 Dolphin:高效精准的文档结构化解析利器
  • 如何安全配置数据库(MySQL/PostgreSQL/MongoDB)
  • 将 Docker 镜像从服务器A迁移到服务器B的方法
  • git merge解冲突后,add、continue提交
  • Lines of Thought in Large Language Models
  • 八股战神-JVM知识速查
  • 机试 | STL | string | 文字处理软件
  • 运动规划实战案例 | 图解基于状态晶格(State Lattice)的路径规划(附ROS C++/Python仿真)
  • 深入浅出对抗学习:概念、攻击、防御与代码实践
  • Neo4j(二) - 使用Cypher操作Neo4j
  • 09、供应商管理数字化转型:从潜在评估到战略合作的系统化方法
  • AI时代新词-AI增强现实(AI - Enhanced Reality)
  • 批量转存夸克网盘内容并分享实操教程
  • Swagger与go-zero框架生成和展示API文档详解
  • “安康杯”安全生产知识竞赛活动流程方案
  • 特征分解:线性代数在AI大模型中的核心工具
  • sqlite的拼接字段的方法(sqlite没有convert函数)