我有遗留代码定义了以下帮助器
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>'
有没有一种方法不仅可以编译,还可以在运行时运行?
问题是你正在尝试组合两种不同的委托类型:Func<T, TResult>和Function<T, TResult>.尽管它们具有相同的签名,但它们是不同的,因此是不兼容的类型.
使用lambda在两者之间创建转换层.
Func<T, TResult> func = ...;
TheMethod(x => func(x));
Run Code Online (Sandbox Code Playgroud)
Jared和phoog都是正确的.第三种方法是做同样的事情,只是为了完善它,是:
Func<int, string> func = i => i.ToString();
Function<int, string> function = func.Invoke;
Run Code Online (Sandbox Code Playgroud)
也就是说,新委托是第一个委托的invoke方法的委托,该委托具有正确的签名.
那个必须这样做是极端的烦恼.如果我们今天从头开始设计运行时,知道我们现在知道的人们如何使用委托类型,我认为可能每个签名都有一个内置的委托类型(就像有一个 "整数的单维数组") "类型",或代表类型之间会有"结构身份".下次为虚拟机设计类型系统时,请记住这一点.
你可以像JaredPar建议的那样创建一个lambda,或者将一个传递给另一个的构造函数:
Func<int, string> f1 = i => i.ToString();
Function<int, string> f2 = new Function<int, string>(f1);
Run Code Online (Sandbox Code Playgroud)