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

时间:2012-02-22 22:49:54

标签: c# delegates func

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

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

但我想提供Func<T,TResult>

转换尝试无法编译

  

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

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

3 个答案:

答案 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);