2010-01-21 18 views
5

Los documentos dicen:¿Cuál es la diferencia entre IDelegateEvent e IEvent en F #?

F # da un estatus especial a las propiedades de miembro de instancia no virtuales compatibles con el tipo IDelegateEvent, la generación de metadatos .NET approriate para hacer que el miembro de aparecer a otros lenguajes .NET como un evento de .NET.

Pero el comportamiento de IDelegateEvent y IEvent parece ser el mismo con o sin el atributo CLIEvent.

Estoy usando 1.9.7.8.

Respuesta

4

IEvent hereda de IDelegateEvent, pero impone una restricción adicional sobre el tipo de delegado permitido (lo que obliga a devolver la unidad). IEvent también hereda de IObservable. A menos que desee tener un evento con un tipo raro, no hay ninguna razón para confiar en la interfaz base IDelegateEvent en lugar del IEvent más común.

¿Qué quiere decir cuando dice que [<CLIEvent>] no hace la diferencia? En FSI hay un error que impide que los eventos se generen correctamente en el tipo (por ejemplo, como se ve en Type.GetEvents()), pero los eventos se generan correctamente cuando se compila el código. Incluso FSI debería ver los métodos add_ y remove_ que se generan cuando aplica el atributo [<CLIEvent>].

+0

Creo que los documentos son engañosos. El párrafo citado anteriormente parece indicar que debe usar IDelegateEvent si desea un evento .NET ordinario; de lo contrario, use IEvent. Suena como si IDelegateEvent elimina la necesidad de usar el atributo CLIEvent. – Daniel

+0

Para responder a su pregunta ... y ampliar mi comentario anterior ... IDelegateEvent e IEvent aparecen iguales para otros lenguajes .NET con o sin el atributo CLIEvent. Ambos funcionan bien, pero los documentos parecen indicar que hay una diferencia (tal vez la diferencia radica en que IDelegateEvent no necesita el atributo CLIEvent, que aparentemente es incorrecto). – Daniel

4

Creo que en algunas versiones históricas de F #, utilizaría IDelegateEvent para eventos .NET estándar y IEvent para eventos F #. El atributo CLIEvent se agregó más recientemente (porque la solución original tenía bastantes problemas). Por lo tanto, creo que el IDelegateEvent es muy raramente útil ahora (kvb menciona algunas diferencias más específicas).

Una diferencia más interesante es entre IEvent<'T> que es un evento con manejador Handler<'T> (que se define en algún lugar de las bibliotecas de F #, creo) y IEvent<'Del, 'T> que se puede utilizar con cualquier controlador, por ejemplo IEvent<EventHandler, EventArgs> que aparece con bastante frecuencia en .NET bibliotecas ...

Cuestiones relacionadas