2010-07-13 8 views

Respuesta

16

al llamar a un método que toma cualquier delegado de la Func que no es necesario para crear de forma explícita el delegado, porque F # convierte implícitamente expresiones lambda para delegar el tipo (en llamadas a miembros). Creo que simplemente llamando al método con función lambda debe trabajar

Aquí está un ejemplo simple que muestra esto (si no es así, ¿podría compartir el mensaje de error?):

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

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

En su caso , supongo que algo como esto debería funcionar:

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

en cuenta que necesita upcast explícita (expr :> obj), para asegurarse de que la función lambda devuelve el tipo correcto (obj). Si desea asignar la función lambda a un valor local usando let, entonces no funcionará, porque la conversión implícita solo funciona cuando se pasa como un argumento directamente. Sin embargo, en ese caso, hace que el código sea un poco más agradable.

+0

Creo que hay un error ortográfico en su ejemplo, ya que 'Bar' toma' Func 'pero está pasando un' Func 'implícito'. – kvb

+0

@kvb: tienes razón, corrigió el error tipográfico, ¡gracias! –

+0

Tiene razón. Gracias Tomás. En mi caso, ni siquiera necesitaba el elenco. Mi problema original fue que hice esto: let acc = (fun() -> model) let meta = m.GetMetadataForType (acc, t) que no convierte, cambiando a esto: let meta = m .GetMetadataForType ((fun() -> model), t) funcionó bien. –

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

Pude omitir la palabra clave 'nueva' también. –

4

Normalmente se puede pasar en cualquier () -> obj y éste se convertirá automáticamente a Func<obj>. Es posible que necesite para envolver su fun con Func<obj>:

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

val d : Func<obj> 
Cuestiones relacionadas