Dlaczego kompilator C# nie wyprowadza z faktu, że FooExt.Multiply()
spełnia sygnaturę Functions.Apply()
? Muszę określić oddzielną zmienną delegującą typu Func<Foo,int,int>
, aby kod zadziałał ... ale wygląda na to, że wnioskowanie o tym powinno być obsługiwane. Czy się mylę? A jeśli tak, dlaczego?Dlaczego kompilator C# nie automatycznie wyprowadza typy z tego kodu?
EDIT: Błąd kompilacji otrzymał brzmi:
Argumenty typu dla metody
FirstClassFunctions.Functions.Apply<T1,T2,TR>(T1, System.Func<T1,T2,TR>, T2)'
nie można wywieść z użytkowania. Spróbuj określając argumenty typu jawnie
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);
}
}
Powinny również działać następujące: 'x.Apply (new Func (FooExt.Multiply), 5)'. Co to jest błąd kompilacji? –
thecoop
Wydaje się kompilować dobrze dla mnie, w .NET 4.0. –
możliwy duplikat wnioskowania ogólnego typu [C# 3.0 - przekazywanie delegata jako parametru funkcji] (http://stackoverflow.com/questions/407983/c-3-0-generic-type-inference-passing-a-delegate- as-a-function-parameter) – thecoop