2010-07-13 3 views

Répondre

16

Lorsque vous appelez une méthode qui prend un délégué du Func vous ne devriez pas avoir besoin de créer explicitement le délégué, car F # convertit implicitement les expressions lambda en type délégué (dans les appels membres). Je pense que tout simplement appeler la méthode avec la fonction lambda devrait fonctionner

Voici un exemple simple qui démontre cela (si elle n'a pas, pourriez-vous partager le message d'erreur?):

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

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

Dans votre cas Je suppose que quelque chose comme cela devrait fonctionner:

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

Notez que vous avez besoin upcast explicite (expr :> obj), pour vous assurer que la fonction lambda retourne le type (obj). Si vous souhaitez affecter la fonction lambda à une valeur locale à l'aide let, il ne fonctionnera pas, parce que la conversion implicite ne fonctionne que lorsqu'il est passé comme un argument directement. Cependant, dans ce cas, cela rend le code un peu plus agréable.

+0

Je pense qu'il ya une faute de frappe dans votre exemple, puisque 'bar' prend un' 'Func mais vous passez implicitement' 'Func . – kvb

+0

@kvb: vous avez raison, corrigé la faute de frappe, merci! –

+0

Vous avez raison. Merci Tomas. Dans mon cas, je n'avais même pas besoin de la distribution. Mon problème initial était que je l'ai fait: laisser acc = (fun() -> modèle) laisser meta = m.GetMetadataForType (acc, t) qui ne convertit pas, le passage à ceci: laisser meta = m .GetMetadataForType ((fun() -> modèle), t) a bien fonctionné. –

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

j'ai pu omettre le mot-clé « nouveau » aussi bien. –

4

Vous pouvez passer normalement dans une () -> obj et il sera automatiquement converti Func<obj>. Vous devrez peut-être pour envelopper votre fun avec Func<obj>:

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

val d : Func<obj> 
Questions connexes