为什么不能推断出这些类型的论点?

时间:2011-09-08 18:47:19

标签: c# .net generics type-inference

  

可能重复:
  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>)的类型参数       无法从使用中推断出来。尝试明确指定类型参数。

3 个答案:

答案 0 :(得分:2)

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

Method((Action<int>)Action); // Legal

答案 1 :(得分:0)

刚才这是一个编译器,我明白你的意思。

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

如果你把它投射到这种类型它可以工作:

Method((Action<int>)Action);

答案 2 :(得分:0)

这有效:

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

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

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