C#中的通用函数类型推断

时间:2016-04-16 19:04:27

标签: c# generics type-inference

为什么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);

我认为没有办法解决这个问题,但如果被证明是错误的话会很好,我不明白为什么它不能推断出使用的类型。

编译器无法解决此类推理问题的根本原因是什么?是否可以做任何事情来使上述管道/组合“操作符”工作(具有强类型泛型,无反射等。 )而不必明确提供类型参数?

如果没有那么这个管道功能(以及同一系列中的其他类似功能)是无用的并且增加了语法噪音而不是减少它。

0 个答案:

没有答案