2010-07-13 12 views

cevap

16

açıkça oluşturmak gerekmez Func herhangi temsilci götüren bir yöntemi çağırmak delege, çünkü F #, lambda ifadelerini delege türüne (üye çağrılarında) dolaylı olarak dönüştürür. Sadece lamda işlevi ile yöntemini çağırarak çalışması gerektiğini düşünüyorum İşte

bu gösterir basit bir örnek (o değilse, hata mesajı payı olabilir?): Senin durumunda

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

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

Ben böyle bir şey çalışması gerekir varsayalım: Eğer açık upcast (expr :> obj) ihtiyaç

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

Not lambda fonksiyonu doğru türde (obj) döndürür emin olmak için. Eğer lambda işlevini let kullanarak yerel bir değere atamak istiyorsanız, o zaman işe yaramaz, çünkü örtük dönüştürme yalnızca bir argüman olarak doğrudan iletildiğinde çalışır. Ancak, bu durumda, kodu biraz daha güzel hale getirir.

+0

Örneğinizde "Bar" bir "Func " aldığından, ancak bir "Func " ifadesini geçtiğinizden bir yazım hatası olduğunu düşünüyorum. – kvb

+0

Kvb: Haklısın, yazım hatası düzeltildi, teşekkürler! –

+0

Haklısınız. Teşekkürler Tomas. Benim durumumda, oyuncuya bile ihtiyacım yoktu. meta = m olsun: - meta = dönüştürmez m.GetMetadataForType (acc, t) , bu geçiş izin acc = let (> modeli (fun)): Benim asıl sorun bu yaptığımız oldu .GetMetadataForType ((fun() -> model), t) iyi çalıştı. –

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

'Yeni' anahtar kelimesini de çıkarmayı başardım. –

4

Normalde herhangi () -> obj geçirebilirsiniz ve otomatik Func<obj> dönüştürülecektir. Sen gerekebilir sarmak için senin funFunc<obj> ile:

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

val d : Func<obj> 
İlgili konular