通用类型推断说明

时间:2013-10-03 11:32:51

标签: c# visual-studio-2010 visual-studio-2012 compiler-construction

我有以下代码:

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年使用,以及在规范中解释的是什么?

1 个答案:

答案 0 :(得分:2)

问题来自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);
        }
    }
}

Microsoft在C#语言规范5.0版中没有明确回答这个问题(参见第7.5.2节)。

有关详情,请参阅此类似问题的答案:why-doesnt-this-code-compile-in-vs2010-with-net-4-0