首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有in修饰符的事件args的Observable.FromEvent会导致异常。

具有in修饰符的事件args的Observable.FromEvent会导致异常。
EN

Stack Overflow用户
提问于 2022-06-18 00:23:52
回答 1查看 66关注 0票数 2

我使用的是一个第三方库,它有一个事件\事件处理程序,我想将它转换为一个可观察的程序。事件处理程序委托需要一个带有in关键字的结构。这导致了一个例外:

System.ArgumentException -不能绑定到目标方法,因为它的签名与委托类型的签名不兼容。

从…

代码语言:javascript
复制
System.Private.CoreLib.dll!System.Reflection.RuntimeMethodInfo.CreateDelegateInternal(System.Type delegateType, object firstArgument, System.DelegateBindingFlags bindingFlags) Line 556    C#
    System.Private.CoreLib.dll!System.Reflection.RuntimeMethodInfo.CreateDelegate(System.Type delegateType, object target) Line 534 C#
    System.Reactive.dll!System.Reactive.ReflectionUtils.CreateDelegate<Test.TheDelegate>(object o, System.Reflection.MethodInfo method) Line 18 C#

如果我从参数中移除in,它就会像预期的那样工作。我不明白为什么?甚至可以这么做吗?

代码语言:javascript
复制
using System;
using System.Diagnostics;
using System.Reactive.Linq;

Test test = new();

Start();
test.TriggerEvent();
test.TriggerEvent();

void Start()
{
    Debug.WriteLine("Start");
    var o = Observable.FromEvent<Test.TheDelegate, SomeStruct>
        (h => test.TheEvent += h, 
         h => test.TheEvent -= h)
                      .Subscribe(OnNext);
}

void OnNext(SomeStruct s) => Debug.WriteLine("OnNext");

public class Test
{
    public delegate void TheDelegate(in SomeStruct o);

    // Without the in (or ref) keyword, no exception
    //public delegate void TheDelegate(SomeStruct o);

    public event TheDelegate? TheEvent;

    public void TriggerEvent()
    {
        SomeStruct s = new();
        TheEvent?.Invoke(s);
        Debug.WriteLine("Event Fired");
    }
}

public struct SomeStruct
{ }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-18 09:49:41

我能够在运行时复制ArgumentException。要解决这个问题,您可以使用具有额外conversion参数的conversion重载:

代码语言:javascript
复制
public static IObservable<TEventArgs> FromEvent<TDelegate, TEventArgs>(
    Func<Action<TEventArgs>, TDelegate> conversion,
    Action<TDelegate> addHandler,
    Action<TDelegate> removeHandler);

用法:

代码语言:javascript
复制
var observable = Observable.FromEvent<Test.TheDelegate, SomeStruct>
(
    action => (in SomeStruct arg) => action(arg),
    h => test.TheEvent += h,
    h => test.TheEvent -= h
);
var subscription = observable.Subscribe(OnNext);

conversionAction<SomeStruct>转换为Test.TheDelegate。与更简单的重载相反,在编译时检查转换的有效性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72665837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档