我有遗留代码定义了以下帮助器
public delegate R Function<T, R>(T t);
但我想提供Func<T,TResult>
转换尝试无法编译
无法将类型“
System.Func<T,TResult>
”转换为“Rhino.Mocks.Function<T,TResult>
”
有没有一种方法不仅可以编译,还可以在运行时运行?
答案 0 :(得分:9)
问题是您正在尝试合并两种不同的委托类型:Func<T, TResult>
和Function<T, TResult>
。尽管它们具有相同的签名,但它们是不同的,因此是不兼容的类型。
使用lambda在两者之间创建转换层。
Func<T, TResult> func = ...;
TheMethod(x => func(x));
答案 1 :(得分:9)
Jared和phoog都是正确的。第三种方法是做同样的事情,只是为了解决这个问题:
Func<int, string> func = i => i.ToString();
Function<int, string> function = func.Invoke;
也就是说,新委托是第一个委托的调用方法的委托,该委托具有正确的签名。
那个人必须这样做是极端的烦恼。如果我们今天从头开始设计运行时,知道我们现在知道人们如何使用委托类型,我认为可能会为每个签名建立委托类型的一个(就像有一个“整数的单维数组”类型),或者在委托类型中会有“结构标识”。下次为虚拟机设计类型系统时,请记住这一点。
答案 2 :(得分:8)
你可以像JaredPar建议的那样创建一个lambda,或者将一个lambda传递给另一个的构造函数:
Func<int, string> f1 = i => i.ToString();
Function<int, string> f2 = new Function<int, string>(f1);