C#泛型——为什么lambda表达式有效,而简单方法无效?

18

我很难理解为什么C#编译器可以推断类型

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

但不适用于

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

有时似乎前者比后者更复杂,为什么会这样?


11
等待Jon Skeet。 - MK_Dev
2
@KirkWoll等人 - 框架版本并不重要,导致问题的是编译器版本。因此,我认为这个问题只会出现在VS2008中。 - RJ Lohan
1
此外 - 我认为你会在这篇文章中找到答案:http://blogs.msdn.com/b/ericlippert/archive/2007/11/05/c-3-0-return-type-inference-does-not-work-on-member-groups.aspx - RJ Lohan
1
@RJLohan:确实,请把它作为答案发布!(哈哈,Eric在我发帖之前就回答了我的问题...) - user541686
1
@CommuSoft:Lambda演算并不真正涉及其中,但是lambda表达式只是“语法糖”。有时编译器需要创建另一个类,有时则不需要,这取决于捕获的内容。但这并不意味着你声称第二种形式使用了lambda表达式更加有效-它根本就没有。两者都使用委托,但只有第一种版本使用lambda表达式。 - Jon Skeet
显示剩余12条评论
1个回答

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 中,当方法组可以与从委托中推导出的完全固定的参数类型相关联时,返回类型推断会作用于方法组参数。一旦与方法组相关联的参数类型已知,超载解析就可以明确地确定哪个方法与委托形式参数相关联;然后我们可以从指定的方法到委托返回类型进行返回类型推断。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接