visual valid name generate example documentacion comment comentarios code c# delegates func

c# - valid - ¿Cómo convierto delegar R Función<T, R>(T t) a Func<T, R>?



param name c# (3)

Tengo un código heredado que define el siguiente ayudante

public delegate R Function<T, R>(T t);

Pero quiero suministrar un Func<T,TResult>

los intentos de lanzamiento no se compilan

No se puede convertir el tipo '' System.Func<T,TResult> '' en '' Rhino.Mocks.Function<T,TResult> ''

¿Hay alguna manera de que no solo compile, sino que funcione en tiempo de ejecución?


El problema es que está intentando combinar dos tipos de delegados diferentes: Func<T, TResult> y Function<T, TResult> . Aunque tienen la misma firma, son tipos diferentes y, por lo tanto, incompatibles.

Use una lambda para crear una capa de conversión entre los dos.

Func<T, TResult> func = ...; TheMethod(x => func(x));


Jared y Phohoog son los dos correctos. Una tercera forma de hacer lo mismo, solo para completarlo, es:

Func<int, string> func = i => i.ToString(); Function<int, string> function = func.Invoke;

Es decir, el nuevo delegado es un delegado al método de invocación del primer delegado , que tiene la firma correcta.

Que uno tiene que hacer esto es irritante en extremo. Si hoy diseñamos el tiempo de ejecución desde cero, sabiendo lo que ahora sabemos acerca de cómo las personas usan tipos de delegados, creo que es probable que haya uno integrado en el tipo de delegado para cada firma (al igual que una matriz de enteros unidimensionales) "tipo), o que habría" identidad estructural "entre los tipos de delegados. La próxima vez que diseñe el sistema de tipos para una máquina virtual, tenga esto en cuenta.


Puedes crear un lambda como lo sugiere JaredPar, o pasar uno al constructor del otro:

Func<int, string> f1 = i => i.ToString(); Function<int, string> f2 = new Function<int, string>(f1);