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

本文关键字:方法 类型参数 推断出 用法 不能 | 更新日期: 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/