2013-10-15 2 views
2

Если я смотрю на 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>

enter image description here Что может объяснить это?


Добавление экстракта спецификации, указанной в ответе:


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 #.

ответ

2

Посмотрите на how the spec defines ограничение делегата: аргумент отправителя obj неявный.

+0

Знаете ли вы, что было бы наименее навязчивым способом вернуть поток obj * arg? – nicolas

+0

Я не уверен, что понимаю ваш вопрос; не могли бы вы рассказать о проблеме, которую пытаетесь решить? – kvb

Смежные вопросы