2010-11-15 16 views
11

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); 
     } 
    } 
+0

Powinny również działać następujące: 'x.Apply (new Func (FooExt.Multiply), 5)'. Co to jest błąd kompilacji? – thecoop

+1

Wydaje się kompilować dobrze dla mnie, w .NET 4.0. –

+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

Odpowiedz

5

Wierzę, że to jest wynikiem niezdolności VS2008 kompilator C#, aby prawidłowo wywnioskować typy zaangażowane podczas konwersji grupę metody do delegata. @Eric Lippert omawia to zachowanie w swoim poście C# 3.0 Return Type Inference Does Not Work On Method Groups.

Jeśli dobrze pamiętam, wprowadzono pewne ulepszenia w nowym kompilatorze C# będącym częścią VS2010, który rozszerza przypadki, w których możliwe jest wnioskowanie grupy metod.

Teraz zasady wnioskowania typu są dość skomplikowane i jestem daleko od eksperta w tej dziedzinie. Mam nadzieję, że ktoś z prawdziwą wiedzą może odpowiedzieć na to pytanie, jeśli się mylę.

+0

Twoja analiza jest prawidłowa. –

+0

@Eric Lippert: Dzięki za potwierdzenie. BTW, pomyślałem, że pamiętam, że blogujesz o usprawnieniach w typowaniu w najnowszym kompilatorze C#, ale nie mogę znaleźć żadnego artykułu na twoim blogu o takim skutku ... może to sobie wyobraziłem. – LBushkin

+0

Wspomniałem, że mamy zamiar to naprawić, tutaj: http://blogs.msdn.com/b/ericlippert/archive/2008/05/28/method-type-inference-changes-part-zero.aspx –

Powiązane problemy