方法的类型参数无法根据使用情况推断。

3
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

我遇到了一个非常熟悉的错误信息:

无法从使用情况中推断出方法“方法名称”的类型参数。请尝试明确指定类型参数。

有什么想法吗?


3
你尝试使用C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe了吗?可能是因为VS2010和3.5 MSBuild之间的C#编译器版本不同导致的。 - Adam Houldsworth
你是在命令行上使用 /r:NUnit.dll 或类似的方式引用 NUnit dll 吗?希望这能帮到你。 - Jeremy E
这个版本的msbuild确实可以工作。但是由于我们的生产环境,我有点卡在了3.5框架上。我能否在使用这个版本的msbuild时针对3.5框架进行目标设置?使用/tv:3.5选项会再次导致错误。 - Radek Stromský
@Radex,我把我的评论改成了答案。 - Adam Houldsworth
1个回答

6
这似乎是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/


3
最终,我已经能够使用以下命令使用msbuild 4.0为Framework 3.5构建它:"c:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Solution1.sln /p:TargetFrameworkVersion=v3.5 - Radek Stromský
@Radex 不错!很高兴你解决了问题。我会在我的答案中加入你的命令行示例。 - Adam Houldsworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接