文档说:
F#为与类型IDelegateEvent兼容的非虚拟实例成员属性赋予特殊状态,生成适当的.NET元数据,以使该成员对其他.NET语言显示为.NET事件。
但是,无论有没有CLIEvent属性,IDelegateEvent和IEvent的行为都是相同的。
我正在使用1.9.7.8。
答案 0 :(得分:4)
IEvent继承自IDelegateEvent,但对允许的委托类型施加了额外的约束(强制它返回单位)。 IEvent也继承自IObservable。除非您想要一个具有奇怪类型的事件,否则没有理由依赖基础IDelegateEvent接口而不是更常见的IEvent。
当你说[<CLIEvent>]
没有什么区别时,你是什么意思?在FSI中,有一个错误可以防止在类型上正确生成事件(例如,通过Type.GetEvents()
看到),但是在编译代码时会正确生成事件。即使是FSI,你应该看到在应用[<CLIEvent>]
属性时生成的add_和remove_方法。
答案 1 :(得分:4)
我认为在F#的某些历史版本中,您可以将IDelegateEvent
用于标准.NET事件,将IEvent
用于F#事件。最近添加了CLIEvent
属性(因为原始解决方案存在很多问题)。所以,我认为IDelegateEvent
现在很少有用( kvb 提到了一些更具体的差异)。
更有趣的区别在于IEvent<'T>
,它是一个带有处理程序Handler<'T>
的事件(我相信在F#库中的某个地方定义)和IEvent<'Del, 'T>
可以与任何处理程序一起使用,例如IEvent<EventHandler, EventArgs>
,它在.NET库中经常出现......