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

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)

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

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

有任何想法吗?

Ada*_*rth 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

只是为了澄清,这是我基于评论的受过教育的猜测答案.

不确定这是否相关,但我在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-in​​ference-with-c-4/

  • 最后,我已经使用msbuild 4.0 for Framework 3.5使用以下命令构建它:`"c:\ Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe"Solution1.sln/p:TargetFrameworkVersion = v3. 5` (3认同)