泛型类型推断解释

问题描述 投票:0回答:1

我有以下代码:

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 年可以使用此功能,以及在规范中的何处对此进行了解释吗?

c# visual-studio-2010 visual-studio-2012
1个回答
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);
        }
    }
}

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

有关更多信息,您可以阅读类似问题的答案:why-doesnt-this-code-compile-in-vs2010-with-net-4-0

© www.soinside.com 2019 - 2024. All rights reserved.