我有以下代码:
namespace ConsoleApplication1
{
using System.Collections.Generic;
using System.Linq;
internal class Program
{
private static void Main(string[] args)
{
var bar = new object();
var result = new int[] { 1, 2, 3 }
.Select/* <int,int> */(bar.Test<int>)
.ToList();
}
}
public static class Extensions
{
public static TReturnType Test<TReturnType>(this object o, int e)
{
return default(TReturnType);
}
}
}
在仅使用Visual Studio 2012的计算机上进行编译就像魅力一样.但是,要在仅使用2010的计算机上进行编译,则需要删除< int,int>周围的注释.
有人可以详细说明为什么现在可以在2012年使用,以及在规范中解释这个问题的地方?
最佳答案 问题来自VS2010中扩展方法的类型推断.
如果用静态方法替换扩展方法,则类型推断就可以了:
namespace ConsoleApplication1
{
using System.Collections.Generic;
using System.Linq;
internal class Program
{
private static void Main(string[] args)
{
var result = new int[] { 1, 2, 3 }
.Select/* <int,int> */(Extensions.Test<int>)
.ToList();
}
}
public static class Extensions
{
public static TReturnType Test<TReturnType>(int e)
{
return default(TReturnType);
}
}
}
在C#语言规范版本5.0中,Microsoft没有明确回答这个问题(参见第7.5.2节).
有关详细信息,请阅读此类似问题的答案:why-doesnt-this-code-compile-in-vs2010-with-net-4-0