2011-09-08 75 views
6

可能重复:
C# 3.0 generic type inference - passing a delegate as a function parameter为什么不能推断这些类型的参数?

为什么不能在Main调用下面的代码示例的类型参数推断?

using System; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Method(Action); 
    } 

    static void Action(int arg) 
    { 
     // ... 
    } 

    static void Method<T>(Action<T> action) 
    { 
     // ... 
    } 
} 

这给出了以下错误消息:

错误CS0411:用于方法Program.Method<T>(System.Action<T>) 类型参数不能从使用推断。尝试明确指定类型参数。

+0

非常感谢。已搜查但我找不到它。 –

+0

@Pieter:达林提到的帖子有答案,并有一些很好的链接到更多的信息。 –

+0

阅读10篇文章或其他内容,但上面的文章不在其中。 –

回答

0

只要把这是一个编译器我明白你的意思。

我认为这是因为Action被用作方法组,但它不是Action<int>类型。

如果你将它转换为这种类型的工作原理:

Method((Action<int>)Action); 
+5

我期望它是int。我猜OP已经知道编译器告诉他了什么。 –

+0

是的,直到我把它放在编译器中,我没有发布问题的上下文。 Action不是很明显,而是指该方法。 – TheCodeKing

0

这工作:

static void Main(string[] args) 
    { 
     Method<int>(Action); 
    } 

    static void Action(int arg) 
    { 
     // ... 
    } 

    static void Method<T>(Action<T> action) 
    { 
     // ... 
    } 
+1

是的,但这不是问题。所问的是为什么OP **显示的内容不能工作。 –

2

的问题是,Action(除了已经是一个类型,请将其重命名)实际上是可转换为委托类型的方法组Action<int>。类型推断引擎不能推断类型,因为方法组表达式是无类型。如果您实际将方法组投影到Action<int>,则输入推论成功:

Method((Action<int>)Action); // Legal 
相关问题