Почему компилятор C # автоматически не определяет типы в этом коде? - PullRequest
11 голосов
/ 16 ноября 2010

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

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

Аргументы типа для метода 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);
        }
    }

1 Ответ

5 голосов
/ 16 ноября 2010

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

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

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

...