如何在C#中定义F#中的事件

时间:2014-06-26 16:03:58

标签: c# .net f#

查看各种文档,在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#代码中添加一个委托?非常感谢。

1 个答案:

答案 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>]与非标准事件类型一起使用,编译器会生成警告。我不确定为什么它不会对你的代码发出警告(也许是一个错误?)。