2009-08-19 5 views
25

Ho visto in altre domande che la sintassi della query di Linq viene compilata su Lambda.Perché non è possibile modificare e continuare a eseguire il debug in presenza di un'espressione Lambda nel metodo?

Quindi, perché non è possibile modificare e continuare quando è presente un'espressione Lambda nel metodo, mentre con la notazione della query è possibile?

ciò che è più irritante, ed è seriamente mi fa passare ad utilizzare query di notazione ovunque, è che, anche se il codice non è nel Lambda, ma c'è un Lambda da qualche altra parte lo stesso metodo, non è possibile modificare-e-continua! Questo è, come, il dolore gratuito inflitto a sviluppatori incauti!

+0

Concordato. Ho usato edit-and-continue molto, ma ora che uso lambda molto, è un po 'come quella funzione. –

+1

possibile duplicato di [Perché non posso modificare un metodo che contiene un metodo anonimo nel debugger?] (Http://stackoverflow.com/questions/581967/why-can-i-not-edit-a-method-that -contains-an-anonimo-method-in-the-debugger) – nawfal

+1

Per chi legge nel 2016, PUOI farlo ora in VS2015. Ci sono ancora alcune limitazioni, ma in generale hanno fatto un ottimo lavoro. – matrixugly

risposta

20

Modifica e continua è in grado di modificare le implementazioni del metodo "live", ma non quali campi sono nei tipi.

Le espressioni lambda (e metodi anonimi) possono finire per creare i propri tipi privati ​​quando acquisiscono variabili. La modifica dell'espressione lambda può modificare i tipi coinvolti, che potrebbero interrompere la modifica e continuare.

Suona come esso dovrebbe possibile effettuare modifiche al codice che non hanno questo effetto, ma ho il sospetto che sia semplicemente più facile per evitare del tutto - il che significa anche che non inizio apportare modifiche e poi scopri che sei stato impedito a metà del tuo cambiamento.

(Personalmente non sono un fan di E & C, in primo luogo, quindi non ho mai notato.)

+4

Grazie. Perché non ti piace E & C? Cosa fai invece? –

+9

Preferisco utilizzare i test unitari. Quindi non ho bisogno di preoccuparmi del riavvio - il che significa che sto sempre usando codice nuovo dall'inizio alla fine. –

+0

Buona spiegazione, grazie –

0

non lo so per certo, ma la mia ipotesi è la complessità intorno per capire fuori ciò che deve cambiare quando ci sono variabili locali coinvolte che vengono sollevate alle classi. Immagino che capire quali cambiamenti sarebbero sicuri e cosa non sarebbe stato ritenuto complesso e soggetto a errori per arrivare a questo punto. Gli strumenti del 2010 si sono concentrati sul threading e sulla nuova interfaccia utente - forse lo otterremo nella prossima versione.

+0

perché? finché non esegui il debug del metodo stesso, potresti pensare che venga emesso un nuovo IL e che il JIT faccia il suo compito quando necessario. Non è come dire, diciamo C++, dove E & C funziona anche se penseresti che avrebbe dovuto lavorare di più. – gbjbaanb

0

Non lo so per certo, ma presumo che abbia a che fare con il modo in cui il compilatore converte le espressioni lambda che formano chiusure in classi generate dal compilatore. Probabilmente non esiste un modo (facile) per applicare le modifiche apportate al codice compilato e preservare lo stato corrente.

Problemi correlati