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

原程序:

cs 复制代码
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,
        };
    }
}

处理后程序:

cs 复制代码
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_NEWER
        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,
        };
#else
        PrimitiveType 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_NEWER
        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,
        };
#else
        PrimitiveType 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 文件中根据语言版本自动设置符号:

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

手动指定版本(可选)

若需强制兼容性,可手动设置语言版本:

cs 复制代码
<PropertyGroup>
  <LangVersion>7.3</LangVersion> <!-- 或 8.0、latest 等 -->
</PropertyGroup>

优点

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

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

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

相关推荐
北域码匠6 小时前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
rockey6278 小时前
C#脚本引擎之AScript与Z.Expressions.Eval对比
c#·.net·script·expression·动态脚本
天下无敌笨笨熊11 小时前
C#Modbus串口开发心得
开发语言·c#
CSDN_RTKLIB11 小时前
const与readonly关键字
c#
leonkay12 小时前
C# 锁机制——【2】深入原理
开发语言·后端·spring·c#·个人开发
geovindu16 小时前
CSharp: Wordcloud
开发语言·后端·c#·.net·.netcore·词云
geovindu17 小时前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式
格林威20 小时前
C# 相机图像阴影校正:使用OpenCvSharp实现工业相机阴影平场校正功能
人工智能·数码相机·opencv·计算机视觉·c#·机器视觉·工业相机
俊昭喜喜里21 小时前
c#中的构造函数
开发语言·数据库·c#
hahaha601621 小时前
HLS高层次综合设计--axi之burst纠偏
开发语言·算法·fpga开发·c#