F#中的IDelegateEvent和IEvent有什么区别?

时间:2010-01-21 18:37:03

标签: f#

文档说:

F#为与类型IDelegateEvent兼容的非虚拟实例成员属性赋予特殊状态,生成适当的.NET元数据,以使该成员对其他.NET语言显示为.NET事件。

但是,无论有没有CLIEvent属性,IDelegateEvent和IEvent的行为都是相同的。

我正在使用1.9.7.8。

2 个答案:

答案 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库中经常出现......