为什么C#编译器不够智能,无法在以下情况下推断类型?
假设我有一个像这样定义的静态成员函数:
static Func<X, Z> pipe<X, Y0, Z>(Func<X, Y0> f0, Func<Y0,Z> f1) => x => f1(f0(x));
然后,我定义了几个要测试的函数:
static double _toDouble(int x) => (double)x;
static short _toShort(double x) => (short)x;
然后,想要
var f = pipe(_toDouble, _toShort);
但令人遗憾的是必须
var f = pipe<int,double,short>(_toDouble, _toShort);
我认为没有办法解决这个问题,但如果被证明是错误的话会很好,我不明白为什么它不能推断出使用的类型。
编译器无法解决此类推理问题的根本原因是什么?是否可以做任何事情来使上述管道/组合“操作符”工作(具有强类型泛型,无反射等。 )而不必明确提供类型参数?
如果没有那么这个管道功能(以及同一系列中的其他类似功能)是无用的并且增加了语法噪音而不是减少它。