泛型类型推断说明

本文关键字:说明 泛型类型 | 更新日期: 2023-09-27 18:33:39

我有以下一段代码:

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);
        }
    }
}

Microsoft在 C# 语言规范版本 5.0 中没有关于这个问题的明确答案(请参阅第 7.5.2 节)。

有关更多信息,您可以阅读这个类似问题的答案:为什么不这样做代码编译vs2010-with-net-4-0