В чем разница между IDelegateEvent и IEvent в F #? - PullRequest
5 голосов
/ 21 января 2010

В документах сказано:

F # придает особый статус свойствам не виртуальных экземпляров, совместимых с типом IDelegateEvent, создавая оценочные метаданные .NET, чтобы этот элемент отображался на других языках .NET как событие .NET.

Но поведение IDelegateEvent и IEvent, по-видимому, одинаково с атрибутом CLIEvent или без него.

Я использую 1.9.7.8.

Ответы [ 2 ]

4 голосов
/ 22 января 2010

Я думаю, что в некоторых исторических версиях F # вы бы использовали IDelegateEvent для стандартных событий .NET и IEvent для событий F #.Атрибут CLIEvent был добавлен совсем недавно (поскольку в исходном решении было немало проблем).Итак, я думаю, что IDelegateEvent очень редко используется сейчас ( kvb упомянул некоторые более конкретные различия).

Более интересная разница между IEvent<'T>, который является событием с обработчиком Handler<'T> (который определен где-то в библиотеках F #, я считаю) и IEvent<'Del, 'T>, который можно использовать с любыми обработчиками, например IEvent<EventHandler, EventArgs>, который довольно часто встречается в библиотеках .NET ...

4 голосов
/ 21 января 2010

IEvent наследуется от IDelegateEvent, но накладывает дополнительное ограничение на тип разрешенного делегата (заставляя его возвращать единицу измерения). IEvent также наследует от IObservable. Если вы не хотите иметь событие со странным типом, нет причин полагаться на базовый интерфейс IDelegateEvent вместо более распространенного IEvent.

Что вы имеете в виду, когда говорите, что [<CLIEvent>] не имеет значения? В FSI есть ошибка, которая не позволяет правильно генерировать события для типа (например, как видно из Type.GetEvents()), но события генерируются правильно, когда код компилируется. Даже если это FSI, вы должны увидеть, что методы add_ и remove_ генерируются, когда вы применяете атрибут [<CLIEvent>].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...