2016-06-24 81 views
5

跟着Functional Reactive Programming教程,其中事件流(Observable)是從System.Timers.Timer.Elapsed事件直接創建的。從F#消耗C#事件#

let timer = new System.Timers.Timer(float 1) 
let observable = timer.Elapsed 
observable 
|> Observable.subscribe ... 

C#

public delegate void OnMessageDelegate(Message message); 

public class Notifier : INotifier 
{ 
    public event OnMessageDelegate OnMessage; 

    public void Notify(Message message) 
    => OnMessage?.Invoke(message); 
} 

定義class引用相應DllF#項目,並試圖從Notifier.OnMessage事件

let Start (notifier : Namespace.Notifier) = 
    notifier.OnMessage  
    |> Observable.subscribe (fun ms -> ... 
    0 

獲得錯誤信息創建Observable

事件'OnMessage'具有非標準類型。如果此事件是以另一種CLI語言聲明的,則可能需要使用該事件的顯式add_OnMessage和remove_OnMessage方法訪問此事件。如果此事件在F#中聲明,則使事件的類型成爲'IDelegateEvent < >'或'IEvent <,_>'的實例化。

消息是自描述性的,我以爲我的目的是從事件創建流而不是通過add_OnMessage方法訂閱它。

+1

如果您擺脫了OnMessageDelegate並將OnMessage更改爲公共事件EventHandler Messaged; (N.b.重命名和類型更改都是故意的) – ildjarn

+0

@ildjarn優秀*事件'OnMessage'具有非標準類型*提示錯誤消息,我沒有得到。發表一個答案,將接受。 – tchelidze

回答

5

似乎F#預計事件的委託類型爲System.EventHandlerSystem.EventHandler<'TEventArgs>的專業化。

嘗試將OnMessage的類型從OnMessageDelegate更改爲EventHandler<Message>