Perché quanto segue non riescono a dedurre R
:inferenza di tipo non riesce misteriosamente
static R Foo<R>(Func<Action<R>, R> call) { ... }
Mentre più o meno lo 'stesso', funziona:
static R Foo<R>(Func<Action, R> call) { ... }
utilizzo:
var i = Foo(ec => -1);
Ways il primo campione "deve" essere chiamato per compilare:
var i = Foo<int>(ec => -1);
- o -
var i = Foo((Action<int> ec) => -1);
Pensieri: Come si può vedere nel secondo frammento di, R
è già determinato dal tipo di ritorno del 'lambda'. Perché lo stesso non può valere per il primo? Anche con l'utilizzo di ec
(che dovrebbe essere un altro suggerimento del compilatore), non riesce a dedurre.
Quindi, nell'esempio, 'ec' è convertibile in un delegato che prende un' int' e restituisce 'void'? –
Nel primo esempio, sì. – leppie
Le regole di inferenza del tipo in C# sono fatte per coprire i casi di base. Ci sono alcuni rari casi in cui le regole (intenzionalmente) non "prendono". – usr