2012-06-04 19 views
9

Por qué hace lo siguiente fallan para inferir R:La inferencia de tipos no misteriosamente

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

Mientras más o menos la 'misma', funciona:

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

de uso:

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

maneras la primera muestra 'debe' ser llamada para compilar:

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

- o -

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

Pensamientos: Como puede verse en el segundo fragmento, R ya está determinado por el tipo de retorno de la 'lambda'. ¿Por qué no puede aplicarse lo mismo a la primera? Incluso con el uso de ec (que debería ser otra pista del compilador), no puede inferir.

+0

Entonces, en su ejemplo, 'ec' es convertible a un delegado que toma' int' y devuelve 'void'? –

+0

En el primer ejemplo, sí. – leppie

+0

Las reglas de inferencia de tipo en C# se hacen para cubrir los casos básicos. Hay algunos casos excepcionales en los que las reglas (intencionalmente) no "toman". – usr

Respuesta

4

creo que el problema no es que el compilador si no inferir R para la función CallWithEscapeContinuation, es que está fallando para inferir un tipo para el 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; 
} 

Mientras que cuando se proporciona el int sugerencia, puede inferir de qué tipo es la lambda y la firma de CallWithEscapeContinuation.

Cuando solo tiene Action (en comparación con Action<R>), lo anterior es irrelevante porque no hay parámetros de tipo que afecten las posibles firmas de la lambda.

+0

El rango devuelve 'IEnumerable ', ¿por qué 'x' sería algo más que' int'? – leppie

+0

Si comenta todo y simplemente devuelve -1 tampoco se deduce el tipo de devolución. – Slugart

+0

También fallará en esto: 'var index = CallWithEscapeContinuation (ec => {ec (1); return -1;});' – leppie

Cuestiones relacionadas