不能从用法中推断出方法的类型参数
本文关键字:方法 类型参数 推断出 用法 不能 | 更新日期: 2023-09-27 18:08:15
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 studio 2010中运行时的一段功能代码。如果我尝试使用MSBUILD从命令行构建这个…
"c:'Windows'Microsoft.NET'Framework'v3.5'MSBuild.exe" Solution1.sln
…我得到非常熟悉的错误信息:
不能推断出方法' method name'的类型参数使用。尝试显式指定类型参数。
任何想法?
这似乎是vs2010和MSBuild 3.5使用的编译器版本之间的差异。这是有意义的,因为类型推断在以后的编译器版本中得到了很大的改进。
如果你需要使用MSBuild 3.5,你需要纠正你的代码:
var result = MyGenericMethod<object>(MyInitializer);
但是,您应该能够使用MSBuild v4并以3.5框架为目标。你也可以在VS 2010中瞄准这个框架。基于这样一个事实,当3.5使用vs2010的代码编译时,我认为它可能会通过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/