【问题标题】:C# generics -- why do lambdas work, when simple methods don't?C# 泛型——为什么 lambda 可以工作,而简单的方法却不行?
【发布时间】:2012-06-01 01:36:06
【问题描述】:

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

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

但不是为了

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

当前者似乎比后者更复杂的推论时。

有人能解释一下为什么会这样吗?

【问题讨论】:

  • 等待乔恩·斯基特。
  • 我没有关注——这两个版本都适合我。我错过了什么吗?
  • @KirkWoll 等人 - 框架版本不相关,它是产生问题的编译器版本。所以问题只会出现在 VS2008 AFAIK 中。
  • 另外——我想你会在这篇文章中找到你的答案:blogs.msdn.com/b/ericlippert/archive/2007/11/05/…
  • @RJLohan:确实,请将其发布为答案! (大声笑埃里克在我发布之前回答了我的问题......)

标签: c# generics type-inference


【解决方案1】:

这篇(存档的)博客文章很好地涵盖了这个问题: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 中,当方法组可以明确地与从委托推导出的一组完全固定的参数类型相关联时,返回类型推断适用于方法组参数。一旦与方法组关联的参数类型已知,则重载决议可以明确地确定方法组中的哪个方法是与委托形式参数相关联的方法;然后我们可以从特定方法到委托返回类型进行返回类型推断。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2011-05-29
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多