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

功能“递归模式”在 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.xdnf.cn/news/9075.html

相关文章:

  • 【产品经理】如何撰写产品文档
  • 解锁webpack:处理跨域devserver、摇树treeshaking、图片压缩sharp
  • ACM模式中输入输出的处理
  • 硅基计划2.0 学习总结 肆 初稿
  • 深度学习---可视化
  • Linux wget 常用命令详解
  • AI时代新词-AI伦理(AI Ethics)
  • 【Linux】磁盘管理,虚拟机CentOS扩展根分区
  • 像造汽车一样造房子:装配式建筑4.0如何重塑未来人居
  • 启程:MCP开发环境配置和旅游攻略案例体验
  • 基于NSGA2算法的无人机航迹规划算法
  • BaseProviderMultiAdapter多布局总结
  • vertica优化
  • 网口XDP-报文回环转发
  • 知识图谱系列(3):构建方法与流程
  • vue3获取两个日期之间的所有时间
  • 解决leetcode第3509题.最大化交错和为K的子序列乘积
  • OceanBase数据库全面解析(高级特性篇)
  • Real2Render2Real:无需动力学仿真或机器人硬件即可扩展机器人数据
  • AI智能混剪核心技术解析(一):字幕与标题生成的三大支柱-字幕与标题生成-优雅草卓伊凡
  • 海思3519V200ARM Linux 下移植 Qt5.8.0
  • 开疆智能Profinet转Profibus网关连接丹佛斯FC300变频器配置案例
  • Windows11+WSL2+Ubuntu22 安装
  • 汽车恒温器行业2025数据分析报告
  • 【Pandas】pandas DataFrame drop_duplicates
  • 【springMVC】springMVC学习系列一:springMVC的组件
  • 调度算法中的轮盘赌与锦标赛选择算子:优势对比与选择策略
  • 创建一个简易的风扇动画界面:基于 WPF 和 XAML 的实现教程
  • 第Y1周打卡——调用官方权重进行检测
  • 每日算法 -【Swift 算法】字符串转整数算法题详解:myAtoi 实现与正则表达式对比