如何将委托R函数<T,R>(T t)转换为Func <T,R>?

Mas*_*low 6 c# delegates func

我有遗留代码定义了以下帮助器

public delegate R Function<T, R>(T t);
Run Code Online (Sandbox Code Playgroud)

但我想提供一个 Func<T,TResult>

转换尝试无法编译

无法将类型' System.Func<T,TResult>' 转换为' Rhino.Mocks.Function<T,TResult>'

有没有一种方法不仅可以编译,还可以在运行时运行?

Jar*_*Par 9

问题是你正在尝试组合两种不同的委托类型:Func<T, TResult>Function<T, TResult>.尽管它们具有相同的签名,但它们是不同的,因此是不兼容的类型.

使用lambda在两者之间创建转换层.

Func<T, TResult> func = ...;
TheMethod(x => func(x));
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 9

Jared和phoog都是正确的.第三种方法是做同样的事情,只是为了完善它,是:

Func<int, string> func = i => i.ToString();
Function<int, string> function = func.Invoke;
Run Code Online (Sandbox Code Playgroud)

也就是说,新委托是第一个委托的invoke方法的委托,该委托具有正确的签名.

那个必须这样做是极端的烦恼.如果我们今天从头开始设计运行时,知道我们现在知道的人们如何使用委托类型,我认为可能每个签名都有一个内置的委托类型(就像有一个 "整数的单维数组") "类型",或代表类型之间会有"结构身份".下次为虚拟机设计类型系统时,请记住这一点.


pho*_*oog 8

你可以像JaredPar建议的那样创建一个lambda,或者将一个传递给另一个的构造函数:

Func<int, string> f1 = i => i.ToString();
Function<int, string> f2 = new Function<int, string>(f1);
Run Code Online (Sandbox Code Playgroud)