2009-08-19 8 views
25

Lo he visto decir en otras preguntas que la sintaxis de consulta Linq se compila en un Lambda.¿Por qué no puedes editar y continuar la depuración cuando hay una expresión Lambda en el método?

¿Por qué no puedes editar y continuar cuando hay una expresión Lambda en el método, mientras que con la notación de consulta puedes?

lo que es más irritante, y está haciendo en serio me considere cambiar a usar consulta notación todas partes, es que incluso si el código no está en la Lambda, pero hay una Lambda en otro lugar del mismo método, no se puede editar-y-continuar! ¡Es como un dolor gratuito infligido a desarrolladores incautos!

+0

De acuerdo. Usé edit-and-continue mucho, pero ahora que uso lambdas mucho, mató esa característica. –

+1

posible duplicado de [¿Por qué no puedo editar un método que contiene un método anónimo en el depurador?] (Http://stackoverflow.com/questions/581967/why-can-i-not-edit-a-method-that -contains-an-anonymous-method-in-the-depurador) – nawfal

+1

Para aquellos que lean en 2016, PUEDEN hacerlo ahora en VS2015. Todavía hay algunas limitaciones, pero en general hicieron un gran trabajo. – matrixugly

Respuesta

20

Editar y continuar es capaz de cambiar implementaciones de métodos "en vivo", pero no qué campos están en tipos.

Las expresiones Lambda (y métodos anónimos) pueden terminar creando sus propios tipos privados cuando capturan variables. Cambiar la expresión lambda puede cambiar los tipos involucrados, lo que rompería la edición y continuaría.

Suena como que debe ser posible hacer cambios en el código que no tienen este impacto, pero sospecho que es simplemente más fácil de prevenir por completo - que también significa que no de inicio hacer cambios y luego descubres que estás impedido a la mitad de tu cambio.

(Personalmente no soy un fan de E & C, en primer lugar, por lo que nunca he notado.)

+4

Gracias. ¿Por qué no te gusta E & C? ¿Qué haces en su lugar? –

+9

Prefiero usar pruebas unitarias. Entonces no necesito preocuparme por reiniciar, lo que significa que siempre estoy usando código nuevo de principio a fin. –

+0

Buena explicación, gracias –

0

No sé a ciencia cierta, pero mi conjetura es la complejidad en torno a averiguar lo que necesita cambiar cuando hay variables locales involucradas que se elevan a las clases. Supongo que averiguar qué cambios sería seguro y qué no se consideró complejo y propenso a errores en este punto. Las herramientas en 2010 se centraron en el enhebrado y la nueva interfaz de usuario, tal vez lo obtengamos en la próxima versión.

+0

¿por qué? siempre y cuando no esté depurando el método en sí, pensaría que se emitiría una nueva IL y que el JIT haría lo suyo cuando fuera necesario. No es como, digamos C + +, donde E & C funciona aunque pienses que tuvo que trabajar más duro. – gbjbaanb

0

No lo sé con certeza, pero supongo que tiene que ver con la forma en que el compilador convierte expresiones lambda que forman cierres en clases generadas por el compilador. Probablemente no haya una forma (fácil) de aplicar los cambios realizados al código compilado y preservar el estado actual.

Cuestiones relacionadas