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.
Entonces, en su ejemplo, 'ec' es convertible a un delegado que toma' int' y devuelve 'void'? –
En el primer ejemplo, sí. – leppie
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