Подтвердить что ты не робот

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

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

EDIT: полученная ошибка компиляции:

Аргументы типа для метода FirstClassFunctions.Functions.Apply<T1,T2,TR>(T1, System.Func<T1,T2,TR>, 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);
        }
    }
4b9b3361

Ответ 1

Я считаю, что это результат неспособности компилятора VS2008 С# правильно выводить типы, связанные с преобразованием группы методов в делегат. @Eric Lippert обсуждает это поведение в своем сообщении С# 3.0 Тип вывода вывода не работает в группах методов.

Если я правильно помню, в новом компиляторе С# были сделаны некоторые улучшения, которые являются частью VS2010, которая расширяет случаи, когда возможен вывод группы методов.

Теперь правила вывода типа довольно сложны, и я далек от эксперта по этому вопросу. Надеюсь, кто-то с некоторыми реальными знаниями может решить этот вопрос, если я ошибаюсь.