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
...我收到了非常熟悉的错误消息:
无法从中推断出方法“方法名称”的类型参数 用法。尝试明确指定类型参数。
有什么想法吗?
答案 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/