c#中方法到函数的隐式转换
本文关键字:转换 函数 方法 | 更新日期: 2023-09-27 18:12:58
我有这个函数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'参数不重载
这是奇怪的,因为我没有调用printAll
,我只是传递它作为一个参数。
Edit: if I cast
Compose (printAll as Func<IEnumerable<int>,IEnumerable<int>>, g);
,但它应该与它一起工作。最糟糕的是,
Compose (x => printAll(x), g);
不幸的是,当所有泛型操作都在进行时,编译器无法解析参数类型。你必须明确
Func<int, IEnumerable<int>> f = Compose<int,IEnumerable<int>,IEnumerable<int>>(printAll, g);
我应该澄清一下。这取决于Visual Studio的版本或您正在使用的编译器。在2012年编译良好,但在2008年需要显式。不确定其他版本
推理系统可能无法确定A
的类型。
您是否尝试显式列出A
而不是结果类型?
例如:Fn.Compose(printAll<int>, g);