You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递方法至接收in Action<ControlPoint<T>,pt>的构造函数时语法报错

问题解决:无法将方法组转换为in Action<ControlPoint<pt>, pt>

错误根源

你的代码存在两个核心问题:

1. 泛型类型不匹配

Test类构造函数使用了泛型参数T,但创建实例时未指定T的具体类型(应为pt),且自定义方法的参数是ControlPoint<pt>,与构造函数里的ControlPoint<T>类型不匹配。

2. 委托与方法签名不兼容

构造函数接收的Action<ControlPoint<T>, pt>委托参数是值传递,但fnc1/fnc2方法的参数用了in修饰符(只读引用传递),两者参数传递逻辑不一致,导致无法隐式转换。另外,构造函数参数里的in Action<...>写法无实际意义,委托本身是引用类型,这种修饰不会改变传递逻辑,反而易造成混淆。

修复方案

步骤1:统一泛型类型

先将Test类声明为泛型类:

public class Test<T>
{
    Action<ControlPoint<T>, T> _callback1;
    Action<ControlPoint<T>, T> _callback2;

    public Test(Action<ControlPoint<T>, T> callback1, Action<ControlPoint<T>, T> callback2)
    {
        _callback1 = callback1;
        _callback2 = callback2;
    }
}

步骤2:匹配参数传递逻辑

有两种可选方案:

选项A:移除方法的in修饰符,适配Action委托签名

修改自定义方法:

void fnc1(ControlPoint<pt> ctrPt, pt pt) {}
void fnc2(ControlPoint<pt> ctrPt, pt pt) {}

创建实例时指定泛型类型:

Test<pt> test = new Test<pt>(fnc1, fnc2);

选项B:自定义带in参数的委托,适配方法签名

若需保留方法的in修饰符,先定义自定义委托:

public delegate void InAction<T1, T2>(in T1 arg1, in T2 arg2);

再修改Test类的委托类型:

public class Test<T>
{
    InAction<ControlPoint<T>, T> _callback1;
    InAction<ControlPoint<T>, T> _callback2;

    public Test(InAction<ControlPoint<T>, T> callback1, InAction<ControlPoint<T>, T> callback2)
    {
        _callback1 = callback1;
        _callback2 = callback2;
    }
}

此时自定义方法可保留in,创建实例方式不变:

Test<pt> test = new Test<pt>(fnc1, fnc2);

内容的提问来源于stack exchange,提问作者WDUK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:33:35