Rad*_*ský 3 .net c# generics msbuild unit-testing
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在Visual Studion 2010中运行时,这是一段正常运行的代码.如果我尝试使用MSBUILD从命令行构建它...
"c:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe" Solution1.sln
Run Code Online (Sandbox Code Playgroud)
...我得到非常熟悉的错误消息:
无法从用法中推断出方法"方法名称"的类型参数.尝试显式指定类型参数.
有任何想法吗?
这似乎是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
只是为了澄清,这是我基于评论的受过教育的猜测答案.
不确定这是否相关,但我在MSDN上找到了这个:http: //msdn.microsoft.com/en-us/library/ee855831.aspx
方法组类型推断
编译器可以推断方法组的泛型和非泛型委托,这可能会引入歧义.
在C#2008中,编译器无法推断方法组的泛型委托.因此,它总是使用非泛型委托(如果存在).
在C#2010中,推断了泛型和非泛型委托的方法组,并且编译器同样可能推断它们.如果您具有委托的通用和非泛型版本并且两者都满足要求,则会引入歧义.例如,以下代码符合C#2008并调用使用非泛型委托的方法.在C#2010中,此代码生成报告模糊调用的编译器错误.
进一步阅读:
http://togaroga.com/2009/11/smarter-type-inference-with-c-4/
| 归档时间: |
|
| 查看次数: |
3653 次 |
| 最近记录: |