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

发布于 2024-12-04 04:45:05 字数 868 浏览 1 评论 0原文

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 Studion 2010 中运行时的一段功能代码。如果我尝试从命令行使用 MSBUILD 构建它......

"c:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe" Solution1.sln

我会收到非常熟悉的错误消息:

无法推断方法“方法名称”的类型参数 的用法。尝试显式指定类型参数。

有什么想法吗?

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();
        }
    }
}

This is a functioning piece of code when running in Visual Studion 2010. If I try to build this using MSBUILD from command line...

"c:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe" Solution1.sln

... I get very familiar error message:

The type arguments for method 'Method name' cannot be inferred from
the usage. Try specifying the type arguments explicitly.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无畏 2024-12-11 04:45:05

这似乎是 VS 2010 和 MSBuild 3.5 使用的编译器版本之间的差异。这是有道理的,因为类型推断在后来的编译器版本中得到了很大的改进。

如果需要使用 MSBuild 3.5,则需要更正代码:

var result = MyGenericMethod(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-使用-c-4 进行推理/

This appears to be a difference between the compiler versions used by VS 2010 and MSBuild 3.5. This makes sense as type inference was improved a lot in later compiler versions.

If you need to use MSBuild 3.5, you'll need to correct your code:

var result = MyGenericMethod<object>(MyInitializer);

However, you should be able to use MSBuild v4 and target the 3.5 framework. You can also target this framework in VS 2010. Based on the fact that when targeting 3.5 using VS 2010 the code compiles, I think it will likely work via MSBuild v4.

Courtesy of Radex in the comments:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Solution1.sln /p:TargetFrameworkVersion=v3.5

Just to clarify, this is my educated-guess answer based on the comments.

Not sure if this is relevant, but I found this on MSDN: http://msdn.microsoft.com/en-us/library/ee855831.aspx

Method group type inference

The compiler can infer both generic and non-generic delegates for
method groups, which might introduce ambiguity.

In C# 2008, the compiler cannot infer generic delegates for method
groups. Therefore, it always uses a non-generic delegate if one
exists.

In C# 2010, both generic and non-generic delegates are inferred for
method groups, and the compiler is equally likely to infer either.
This can introduce ambiguity if you have generic and non-generic
versions of a delegate and both satisfy the requirements. For example,
the following code complies in C# 2008 and calls a method that uses a
non-generic delegate. In C# 2010, this code produces a compiler error
that reports an ambiguous call.

Further reading:

http://togaroga.com/2009/11/smarter-type-inference-with-c-4/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文