在C#中将方法隐式转换为Func

时间:2014-07-14 21:19:52

标签: c#

我有这个函数printAll打印IEnumerable

的所有元素
IEnumerable<A> printAll<A> (IEnumerable<A> able) {
    foreach (var a in able) {
        print (a);  
    }
    return able;
}

我还有一个函数Fn.Compose,它组成了定义为

的函数
Func<A,C> Compose<A,B,C> ( Func<B,C> g, Func<A,B> f ) {
    return x => g (f (x));
}

我使用Compose获取f

Fun<int, IEnumerable<int>> f = Fn.Compose (printAll, g);

其中g的类型为

Func<int,IEnumerable<int>>

至少在编辑器中没有警告,但是当我编译时出现此错误

  

方法printAll' takes 0&#39;没有重载参数

这很奇怪,因为我没有打电话给printAll,我只是把它作为一个参数传递。

修改:如果我投了

就可以使用
Compose (printAll as Func<IEnumerable<int>,IEnumerable<int>>, g);

但它应该可以解决它。最糟糕的是,这是有效的

Compose (x => printAll(x), g);

2 个答案:

答案 0 :(得分:1)

不幸的是,随着所有泛型操作的进行,编译器无法解析参数类型。你必须明确

Func<int, IEnumerable<int>> f = Compose<int,IEnumerable<int>,IEnumerable<int>>(printAll, g);

我应该澄清一下。这取决于Visual Studio的版本或您正在使用的编译器。在2012年编译好,但需要在2008年明确。不确定其他版本。

答案 1 :(得分:0)

推理系统可能无法确定A的类型。

您是否尝试过明确列出A而不是结果类型?

例如Fn.Compose(printAll<int>, g);