2012-06-04 8 views
9

Dlaczego następuje nie wnioskować R:Rodzaj wnioskowanie nie tajemniczo

static R Foo<R>(Func<Action<R>, R> call) { ... } 

Chociaż dość dużo 'sam', działa:

static R Foo<R>(Func<Action, R> call) { ... } 

wykorzystania:

var i = Foo(ec => -1); 

Ways pierwsza próbka "musi" być wywołana do kompilacji:

var i = Foo<int>(ec => -1); 

- lub -

var i = Foo((Action<int> ec) => -1); 

myśli: Jak można zobaczyć na drugim fragmentem, R jest już określone przez rodzaj powrotnego „lambda”. Dlaczego to samo dotyczy pierwszego? Nawet przy użyciu ec (która powinna być inną wskazówką kompilatora), nie można wnioskować.

+0

W twoim przykładzie "ec" można zamienić na delegata, który przyjmuje 'int' i zwraca' void'? –

+0

W pierwszym przykładzie tak. – leppie

+0

Reguły wnioskowania o typie w języku C# są wprowadzane w celu uwzględnienia podstawowych przypadków. Istnieją rzadkie przypadki, w których reguły (celowo) nie "biorą". – usr

Odpowiedz

4

Myślę, że problemem nie jest to, że kompilator czy braku wywnioskować R dla funkcji CallWithEscapeContinuation, to jest to, że nie udaje się wywnioskować typ dla lambda:

ec => 
{ 
    Enumerable.Range(0, 100).Select(x => 
    { 
       // Called here, the compiler has no idea what signature to expect for `ec` 
       // Could be Action<Int>, could be Action<Decimal> (for example). 
    if (x == 40) ec(x); 
    return x; 
    }).ToList(); 
    return -1; 
} 

natomiast gdy ty zapewnić int Podpowiedź, może wywnioskować, jaki jest typ lambda i podpis CallWithEscapeContinuation.

Po prostu masz Action (w przeciwieństwie do Action (w przeciwieństwie do Action<R>) powyższe jest nieistotne, ponieważ nie ma żadnych parametrów typu wpływających na możliwe podpisy lambda.

+0

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'to coś więcej niż 'int'? – leppie

+0

Jeśli skomentujesz wszystko i po prostu zwrócisz -1, to nie określa on również typu zwracanego. – Slugart

+0

Na tym również się nie uda: 'var index = CallWithEscapeContinuation (ec => {ec (1); return -1;});' – leppie