2010-07-13 32 views

回答

16

調用時,是以Func的任何代表你不應該需要明確創建的方法委託,因爲F#隱含地將lambda表達式轉換爲委託類型(在成員調用中)。我認爲這只是打電話與lambda函數的方法應該工作

下面是一個簡單的例子說明了這一點(如果沒有,你可以分享錯誤消息?):

type Foo() = 
    member x.Bar(a:System.Func<obj>) = a.Invoke() 

let f = Foo() 
let rnd = f.Bar(fun() -> new Random() :> obj) 

你的情況我想,這樣的事情應該工作:

m.GetMetadataForType((fun() -> <expression> :> obj), modelType) 

請注意,你需要明確的向上轉型(expr :> obj),以確保lambda函數返回正確的類型(obj)。如果要使用let將lambda函數分配給本地值,那麼它將不起作用,因爲隱式轉換僅在直接作爲參數傳遞時才起作用。但是,在這種情況下,它使代碼更好一些。

+0

我想你的例子中有一個錯字,因爲'Bar'需要一個'Func ',但是你傳遞了一個隱含的'Func '。 – kvb 2010-07-13 16:40:57

+0

@kvb:你是對的,修正了錯字,謝謝! – 2010-07-13 16:43:15

+0

你是對的。感謝Tomas。就我而言,我甚至不需要演員。 我原來的問題是,我這樣做: let acc =(fun() - > model) let meta = m.GetMetadataForType(acc,t) 不轉換,切換到: let meta = m .GetMetadataForType((fun() - > model),t) 工作正常。 – 2010-07-15 14:26:24

0
let f = new System.Func<obj>(fun() -> printfn "ok"; new obj()) 
+1

我也可以省略'new'關鍵字。 – 2010-07-13 15:10:05

4

可以正常通過任何() -> obj,它會自動轉換爲Func<obj>。您可能需要來包裝你funFunc<obj>

> let d : Func<obj> = Func<obj>(fun() -> box "hello");; 

val d : Func<obj> 
相關問題