C#泛型 - 为什么lambda工作,简单方法不工作?

时间:2012-06-01 01:36:06

标签: c# generics type-inference

我无法理解为什么C#编译器可以推断出

的类型
Array.ConvertAll(new int[1], i => Convert.ToDouble(i));

但不适用于

Array.ConvertAll(new int[1], Convert.ToDouble);

当前者看起来比后者更复杂的时候。

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:11)

此问题已在此(已存档)博文中详细介绍:http://blogs.msdn.com/b/ericlippert/archive/2007/11/05/c-3-0-return-type-inference-does-not-work-on-member-groups.aspx

总之,据我了解(链接是否应该消失);这是C#3.0中有意识的设计决策,因为它不适合在方法组(第二个例子)上执行类型推断。

我想很多人不喜欢这样,所以问题已经解决了C#4.0(从Visual Studio 2010开始);

“在C#4.0中,当方法组可以明确地与从委托推导出的一组完全固定的参数类型相关联时,返回类型推断对方法组参数起作用。一旦与方法组关联的参数类型已知,那么重载决策可以明确地确定方法组中哪个方法是与委托形式参数关联的方法;然后我们可以从特定方法到委托返回类型进行返回类型推断。“