我有这个函数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);
答案 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);