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

c#中方法到函数的隐式转换

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

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

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

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

您是否尝试显式列出A而不是结果类型?

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