查看各种文档,在F#中定义事件的方法是执行类似
的操作type xyz () =
let e = new Event<T>
member x.something_happened : IEvent<T> = x.Publish
不幸的是,IEvent的类型实际上是Miscrosoft.FSharp.Control.IEvent&lt; _&gt;,因此很难在C#中使用。有些文章建议将CLIEvent属性添加到上面的成员something_happended中,但就C#的可用性而言,它似乎没有任何区别,而不包括F#库。
如何在F#中正确定义事件,以便我可以在C#代码中添加一个委托?非常感谢。
答案 0 :(得分:10)
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>]
与非标准事件类型一起使用,编译器会生成警告。我不确定为什么它不会对你的代码发出警告(也许是一个错误?)。