c# - 泛型类型推断解释

标签 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 年有效,以及在规范中的哪个位置对此进行了解释?

最佳答案

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

关于c# - 泛型类型推断解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19158132/

相关文章:

database - VS 2012 数据库项目 "unresolved reference to object"错误

c# - 包装字典以提高可读性?

c# - .net Core 应用程序中 Linux 上的 MySQL.Data 问题

asp.net - 上传我的 ASP.NET 网站?

c# - Visual Studio 中的程序集引用问题

visual-studio-2012 - Visual Studio 2012 安装失败 : Program Compatibility Mode is on

c# - 如何更改 ListView 控件中单个子项的前景色?

c# - 实体集与对象集之间有什么不同

c++ - 在VS2010中排除一个系统头文件

css - 当我在 CSS 文件中开始新评论时,如何阻止 Visual Studio 自动添加评论结束字符