2011-09-13 14 views
7

Mam następujący kod:C# wywnioskować typ rodzajowy na podstawie przechodzącą delegata

public static class X 
{ 
    public static C Test<A,B,C>(this A a, Func<B,C> f) 
     where C:class 
    { 
     return null; 
    } 

} 

public class Bar 
{ 
    public Bar() 
    { 
     this.Test(foo); //this doesn't compile 
     this.Test((Func<int, string>)foo); 
     this.Test((int q) => "xxx"); 
    } 

    string foo(int a) { return ""; } 
} 

Dlaczego nie zaznaczonej linii skompilować? Czy ma to jakiś związek z typem zwrotu, który nie jest częścią podpisu?
Ale trzecia linia ma skompilować, co sprawia, że ​​zgadnę kompilator zamienia ją w coś podobnego do drugiej linii ...

+1

możliwy duplikat wnioskowania ogólnego typu [C# 3.0 - przekazanie delegata jako parametru funkcji] (http://stackoverflow.com/questions/407983/c-3-0-generic-type-inference-passinga-a- deleguj jako parametr funkcji) Przeczytaj te odpowiedzi, a oni podadzą szczegółowe wyjaśnienie. –

Odpowiedz

7

Zasadniczo, proces wnioskowania typu opisanego w punkcie 7.5.2 specyfikacji jest stosunkowo słabe, jeśli chodzi o konwersje grup metod. W adnotacjami standardzie, w sekcji 7.5.2.6, który mówi o typ wyjścia wniosków - w tym grup metoda - istnieje adnotacja z Władimirem Reshetnikov stwierdzając:

Ten krok [grupa typ wyjścia metoda wnioskowania] ma zastosowanie tylko wtedy, gdy wszystkie rodzaje metoda parametry występujące w parametrach parametrów delegatów są już ustalone. Przeciążenie nie próbuje wybrać najlepszej metody na podstawie niekompletnych informacji o typie.

Wierzę, że to jest właśnie problem tutaj - z pewnością masz tylko jedną metodę, którą możesz wywołać, a grupa metod zawiera tylko jedną metodę, ale proces wnioskowania typu nie jest wystarczająco silny, aby powiązać dwóch razem.

Powiązane problemy