无法从用法中推断出方法的类型参数

时间:2011-09-12 14:15:31

标签: c# .net unit-testing generics msbuild

namespace TestLibrary
{
    [TestFixture]
    public class Class1
    {
        public delegate T Initializer<T>();

        public static T MyGenericMethod<T>(Initializer<T> initializer) where T : class
        {
            return initializer != null ? initializer() : null;
        }

        [Test]
        public void Test()
        {
            var result = MyGenericMethod(MyInitializer);
            Assert.IsNotNull(result);
        }

        private object MyInitializer()
        {
            return new object();
        }
    }
}

在Visual Studion 2010中运行时,这是一段正常运行的代码。如果我尝试使用命令行中的MSBUILD构建它...

"c:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe" Solution1.sln

...我收到了非常熟悉的错误消息:

  

无法从中推断出方法“方法名称”的类型参数   用法。尝试明确指定类型参数。

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

这似乎是VS 2010和MSBuild 3.5使用的编译器版本之间的差异。这是有道理的,因为类型推断在以后的编译器版本中得到了很大的改进。

如果您需要使用MSBuild 3.5,则需要更正代码:

var result = MyGenericMethod<object>(MyInitializer);

但是,您应该能够使用MSBuild v4并以3.5框架为目标。您也可以在VS 2010中定位此框架。基于以下事实:当使用VS 2010定向3.5代码编译时,我认为它可能通过MSBuild v4工作。

由Radex在评论中提供:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Solution1.sln /p:TargetFrameworkVersion=v3.5

为了澄清,这是基于评论的 educated-guess 答案。

不确定这是否相关,但我在MSDN上发现了这一点:http://msdn.microsoft.com/en-us/library/ee855831.aspx

  

方法组类型推断

     

编译器可以推断泛型和非泛型委托   方法组,可能会引入歧义。

     

在C#2008中,编译器无法推断方法的泛型委托   组。因此,它始终使用非泛型委托(如果有)   存在。

     

在C#2010中,推断了泛型和非泛型代理   方法组,编译器同样可能推断。   如果您具有泛型和非泛型,这可能会引入歧义   委托的版本,都满足要求。例如,   以下代码符合C#2008并调用使用a的方法   非通用代表。在C#2010中,此代码会产生编译器错误   报告含糊不清的电话。

进一步阅读:

http://togaroga.com/2009/11/smarter-type-inference-with-c-4/