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