Disclaimer: questa risposta richiede indovinare.
Le informazioni su TR
sta nel fatto che è usato come espressione figlio di return
, che, a sua volta, potrebbe essere abbinato con IEither<Foo, Bar>
, per produrre le informazioni che TR
è Bar
.
Ma c'è un problema. Quando il compilatore ha un albero di sintassi astratto, è più semplice iniziare dalla radice e inferire i tipi di espressione, risolvere sovraccarichi, ecc spostandosi progressivamente verso le foglie dell'albero. Questa è la cosa più facile da fare e la cosa che viene fatta più spesso.
tuo scenario richiede il compilatore di lavorare completamente all'indietro - dalla chiamata di metodo per la chiamata al costruttore per l'espressione del bambino di return
e poi di consultare la dichiarazione del metodo corrente (e scoprire che la combinazione corretta è <string, int>
, perché qualsiasi altro non può eventualmente compilare). A prima vista, questo è difficile da raggiungere.
Ma v'è una certa precedenza per questo in C#: è possibile creare una funzione (di ordine superiore) che restituisce semplicemente un lambda e l'inferenza di tipo volontà lavoro basato sulla dichiarazione. Questo tipo di cose funziona anche con lambdas quando si dichiara una variabile locale (non è possibile assegnarli a var
e chiedere al compilatore di dedurre i tipi di parametri dall'utilizzo successivo nell'ambito).
Quindi, perché non l'hanno implementato per il caso che stai descrivendo, considerando che lo hanno fatto con lambda?
- Essi avevano di farlo con lambda: il punto di espressioni lambda è che non dovrebbe essere simile a un grosso problema - che dovrebbe essere il più facile scrivere il più possibile (per esprimere rapidamente una criterio di filtraggio, criterio di selezione, ecc.). Questo ha un valore.
- Anche se questo genere di cose funziona con lambda, è tutt'altro che perfetto - in effetti, può comportarsi in modi molto strani di volta in volta. Quindi può essere visto dai designer come un male necessario che non dovrebbe essere esteso al resto della lingua.
- Il tuo caso è più raro e la soluzione alternativa è semplice.
- Può essere semplicemente il caso di "nessuno lo ha implementato ma".
fonte
2014-10-10 07:12:48
Questa è una domanda molto buona, soprattutto considerando che è possibile restituire lambda allo stesso modo e l'inferenza di tipo funzionerà correttamente. Ma temo che possiamo solo indovinare. –
Non sono sicuro cosa siano 'Foo' e' Bar'. Puoi pubblicare un campione riproducibile completo? –
@SriramSakthivel ha aggiunto MWE – miniBill