О делегировании, событии, четном обработчике, в F #
Если я посмотрю на Control.IEvent <'Delegate,' Args>, он накладывает на 'Args
что
IEvent<'Delegate,'Args when 'Delegate : delegate<'Args,unit>...>
Если посмотреть на событие WorkbookBase.NewSheet, на которое может подписаться WorkbookEvents_NewSheetEventHandler, тип obj-> unit
, я бы ожидал, что 'Args
будет иметь тип obj
в своем типе F #.
Однако я вижу, что событие NewSheet
имеет тип IEvent<WorkbookEvents_NewSheetEventHandler, unit>
Что это может объяснить?
Добавление выдержки из спецификации, упомянутой в ответе:
5.2.8 Ограничения делегата Явное ограничение для делегатов имеет следующий вид:
typar: делегат
Во время решения ограничения (§14.5) тип ограничения: delegate встречается, если тип является типом делегирования D с типом объявления D = делегирование объекта * arg1 *... * argN и tupled-arg-type = arg1 *... * argN. То есть, делегат должен соответствовать шаблону проектирования CLI, где объектом отправителя является первый аргумент события.
Примечание. Эта форма ограничения существует, прежде всего, для определения определенных функций библиотеки F #, связанных с программированием событий. Он редко используется непосредственно в программировании F #.
Ограничение делегата не подразумевает ничего о подтипах. В частности, "ограничение делегата" не означает, что тип является подтипом System.Delegate.
Ограничение делегата применяется только к типам делегатов, которые следуют обычной форме для обработчиков событий CLI, где первый аргумент является объектом "отправитель". Причина в том, что целью ограничения является упрощение представления обработчиков событий CLI программисту F #.
Посмотрите, как спецификация определяет ограничение делегата: аргумент отправителя obj
является неявным.