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

namespace TestLibrary { [TestFixture] public class Class1 { public delegate T Initializer(); public static T MyGenericMethod(Initializer 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 

…我得到非常熟悉的错误消息:

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

有任何想法吗?

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

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

var result = MyGenericMethod(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

只是为了澄清,这是我根据评论得出的有根据的猜测答案。

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

方法组类型推断

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

在C#2008中,编译器无法推断方法组的generics委托。 因此,它总是使用非generics委托(如果存在)。

在C#2010中,推断了generics和非generics委托的方法组,并且编译器同样可能推断它们。 如果您具有委托的通用和非generics版本并且两者都满足要求,则可能会引入歧义。 例如,以下代码符合C#2008并调用使用非generics委托的方法。 在C#2010中,此代码生成报告模糊调用的编译器错误。

进一步阅读:

http://togaroga.com/2009/11/smarter-type-in​​ference-with-c-4/