如何在f#中定义从c#中可见的事件

本文关键字:事件 定义 | 更新日期: 2023-09-27 18:10:28

查看各种文档,在f#中定义事件的方法是这样做的

type xyz () =
    let e = new Event<T>
    member x.something_happened : IEvent<T> = x.Publish

不幸的是,IEvent的类型实际上是microsoft . fsharp . control .IEvent<_>,因此很难在c#中使用。一些文章建议在上面的something_happens成员中添加CLIEvent属性,但就其可用性而言,它似乎与c#没有任何区别,而不包括f#库。

如何在f#中正确定义事件,以便在c#代码中为其添加委托?多谢。

如何在f#中定义从c#中可见的事件

f#中有Event<'T>Event<'Delegate, 'Args>两种事件类型。当[<CLIEvent>]存在时,只有第二个被编译为。net事件。下面是一个工作示例:

type T() =
    let e = Event<EventHandler<_>,_>()
    [<CLIEvent>]
    member x.MyEvent = e.Publish
    member x.RaiseMyEvent() = e.Trigger(x, EventArgs.Empty)

在某些情况下,如果[<CLIEvent>]与非标准事件类型一起使用,编译器会生成警告。我不知道为什么它没有对你的代码提出警告(也许是一个bug?)。