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

Observable.FromEvent绑定带in修饰符参数事件时抛出异常

问题原因

Observable.FromEvent默认重载的内部反射桥接逻辑不支持带in/ref/out修饰符的委托参数。
Rx在自动生成事件适配委托时,会通过反射校验委托签名一致性,要求事件委托的参数必须为值传递形式。当结构体参数加了in修饰符(即只读引用传递)时,反射创建委托的步骤会判定签名不兼容,直接抛出Cannot bind to the target method because its signature is not compatible with that of the delegate type异常,和你提供的调用栈完全对应。
移除in修饰符后参数变为值传递,符合Rx默认的签名校验规则,因此可以正常运行。

解决方法

不需要修改第三方库的委托定义,使用FromEvent支持手动传入转换逻辑的重载,绕开内置的反射签名校验即可:

void Start()
{
    Debug.WriteLine("Start");
    var o = Observable.FromEvent<Test.TheDelegate, SomeStruct>(
        // 手动定义委托转换规则:将原事件的in参数取值后传给Rx的下游处理器
        rxHandler => (in SomeStruct s) => rxHandler(s),
        h => test.TheEvent += h, 
        h => test.TheEvent -= h
    )
    .Subscribe(OnNext);
}

这个写法是Rx官方支持的标准用法,专门用于处理事件委托签名和Rx预期签名不匹配的场景,运行时不会走有问题的反射创建委托逻辑,性能和稳定性和正常用法没有区别。
如果后续遇到带ref/out参数的事件委托,也可以用同样的方式,在转换lambda中处理参数传递逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:39:21