如何在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#中有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?)。