为什么在传递命名方法时不能推断出这些类型参数?

时间:2013-11-27 16:08:54

标签: c# generics delegates type-inference

在下面的代码块中,我在Main中编号了四行。以下是我对他们的问题/评论:

  1. 无法编译,因为Squared不是Func< T,R> (预期)。
  2. 将编译因为平方是Func< T,R> (预期)。
  3. 产生以下编译器错误:

      

    无法从用法推断出方法'ConsoleApplication1.FunctionExt.DelegateOf< T,R>(System.Func< T,R>)'的类型参数。尝试明确指定类型参数。

  4. 产生同样的错误:

      

    方法'ConsoleApplication1.FunctionExt.ForwardCompose< T1,T2,R>(System.Func< T1,T2>,System.Func< T2,R>)'的类型参数不能从使用中推断出来。尝试明确指定类型参数。

  5. 我很感激为什么会出现3和4中的错误。

    public static class FunctionExt
    {
        public static Func<T, R> DelegateOf<T, R>(Func<T, R> func)
        {
            return func;
        }
    
        public static Func<T1, R> ForwardCompose<T1, T2, R>(this Func<T1, T2> func1, Func<T2, R> func2)
        {
            return x => func2(func1(x));
        }
    }
    
    public class Program
    {
        static int Squared(int n)
        {
            return n * n;
        }
    
        static int Plus5(int n)
        {
            return n + 5;
        }
    
        static Func<int, int> squared = Squared;
    
        public static void Main()
        {
            // 1
            Squared.ForwardCompose(Plus5);
    
            // 2
            squared.ForwardCompose(Plus5);
    
            // 3
            FunctionExt.DelegateOf(Squared).ForwardCompose(Plus5);
    
            // 4
            FunctionExt.ForwardCompose(Squared, Plus5);
        }
    }
    

1 个答案:

答案 0 :(得分:0)

编译:

    // 1
    squared.ForwardCompose(Plus5);

    // 2
    squared.ForwardCompose(Plus5);

    // 3
    FunctionExt.DelegateOf(squared).ForwardCompose(Plus5);

    // 4
    FunctionExt.ForwardCompose(squared, Plus5);