2013-10-15 87 views
2

如果我看Control.IEvent<'Delegate,'Args>,它規定'Args在委託,事件,evenhandler,在F#

IEvent<'Delegate,'Args when 'Delegate : delegate<'Args,unit>...> 

看着WorkbookBase.NewSheet Event,到obj-> unitWorkbookEvents_NewSheetEventHandler,可以訂閱,我本來期望'Args在其F#類型中爲obj

但是,我看到事件NewSheet的類型是IEvent<WorkbookEvents_NewSheetEventHandler, unit>

enter image description here 什麼可以解釋這一點?


添加在回答中提到的規範的摘錄:


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#程序員的展示。

回答

2

查看how the spec defines委託約束:obj發件人參數是隱含的。

+0

你知道什麼是最不干擾回收obj * arg流的方法嗎? – nicolas

+0

我不知道我理解你的問題;你能否詳細說明你想解決的問題? – kvb