Почему компилятор C # автоматически не определяет типы в этом коде?

Почему компилятор C # не делает вывод о том, что FooExt.Multiply () удовлетворяет сигнатуре из Functions.Apply () ? Мне нужно указать отдельную переменную делегата типа Func , чтобы код работал ... но похоже, что вывод типа должен справиться с этим. Я ошибся? И если да, то почему?

РЕДАКТИРОВАТЬ: Полученная ошибка компиляции:

Аргументы типа для метода FirstClassFunctions.Functions.Apply (T1, System.Func , T2) ' не может быть выведено из использования. Попробуйте явно указать аргументы типа

namespace FirstClassFunctions  {
    public class Foo  {
        public int Value { get; set; }

        public int Multiply(int j) {
            return Value*j;
        }
    }

    public static class FooExt  {
        public static int Multiply(Foo foo, int j) {
            return foo.Multiply(j);
        }
    }

    public static class Functions  {
        public static Func<TR> Apply<T1,T2,TR>( this T1 obj, 
                                                Func<T1,T2,TR> f, T2 val ) {
            return () => f(obj, val);
        }
    }


    public class Main  {
        public static void Run()  {
            var x = new Foo {Value = 10};
            // the line below won't compile ...
            var result = x.Apply(FooExt.Multiply, 5);
            // but this will:
            Func<Foo, int, int> f = FooExt.Multiply;
            var result = x.Apply(f, 5);
        }
    }
11
задан LBushkin 15 November 2010 в 21:36
поделиться