如果我看Control.IEvent<'Delegate,'Args>,它規定'Args
是在委託,事件,evenhandler,在F#
IEvent<'Delegate,'Args when 'Delegate : delegate<'Args,unit>...>
看着WorkbookBase.NewSheet Event,到obj-> unit
型WorkbookEvents_NewSheetEventHandler,可以訂閱,我本來期望'Args
在其F#類型中爲obj
。
但是,我看到事件NewSheet
的類型是IEvent<WorkbookEvents_NewSheetEventHandler, unit>
什麼可以解釋這一點?
添加在回答中提到的規範的摘錄:
5.2.8 委託約束 一個明確的委託約束有以下形式:
TYPAR:委託
在約束求解(§14.5)中,約束類型:delegate在t ype是一個委託類型D,聲明類型D =委託對象對象* arg1 * ... * argN和tupled-arg-type = arg1 * ... * argN。也就是說,委託必須匹配CLI設計模式,其中sender對象是事件的第一個參數。
注意:此約束表單主要用於定義與事件編程相關的某些F#庫函數。它很少直接在F#編程中使用。
委託約束並不意味着任何有關子類型。特別是,「委託」約束並不意味着該類型是System.Delegate的子類型。
委託約束僅適用於遵循CLI事件處理程序通常形式的委託類型,其中第一個參數是「發件人」對象。原因在於約束的目的是爲了簡化CLI事件處理程序向F#程序員的展示。
你知道什麼是最不干擾回收obj * arg流的方法嗎? – nicolas
我不知道我理解你的問題;你能否詳細說明你想解決的問題? – kvb