Почему компилятор С# не делает вывод о том, что 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);
}
}