2010-08-02 17 views
23

F # powerpack viene con un conjunto de métodos de conversión para traducir de Func < ...> a funciones F #, ya sean estándar o tupidas. Pero, ¿es posible lograr lo opuesto: en caso de que quiera llamar desde el código F # un método C# que toma Func < ...> y desea utilizar la expresión nativa F # lambda (por ejemplo, diversión x -> some_function_of (x))?Interop entre F # y C# lambdas

Si envío una función F # con una firma 'a ->' b para un método de C# que espera Func entonces F # compilador genera el siguiente error:

This expression was expected to have type Function<'T,'R> but here has type 'T -> 'R

me quiero quedar con F expresiones # lambda, pero usar una capa de traducción para poder enviarlos como C# Func lambda. Es esto alcanzable?

+1

Para cualquier persona que tenga problemas para encontrar los métodos de conversión en PowerPack mencionados aquí, están en FSharp.PowerPack.Linq, FuncConvertExtensions –

Respuesta

30

F # proporciona constructores para todos los tipos de delegados que toman valores F # de los tipos de funciones correspondientes. P.ej. en su caso, quiere usar System.Func<_,_>(fun x -> ...) que aplica el constructor generado de tipo ('a -> 'b) -> System.Func<'a, 'b>.

+0

¡Por supuesto! Gracias por una respuesta rápida. –

+1

¿esto se aplica a 'Expression >' también? – Maslow

+0

A veces vale la pena ir a la tercera página de los resultados de Google. A ++++ votaría nuevamente. –