为什么在方法中使用Lambda表达式时无法进行编辑和继续调试?

29

我在其他问题中看到过人们说Linq查询语法会编译为Lambda表达式。

那么,为什么当方法中存在Lambda表达式时,你不能进行编辑和继续操作,而使用查询符号则可以呢?

最让人恼火的是,这严重让我考虑到处都切换到使用查询符号,即使你的代码不在Lambda中,但在同一方法中的其他地方有Lambda,你也无法进行编辑和继续操作!这就是对未经事先警告的开发人员施加的毫无意义的痛苦!


同意。我以前经常使用“编辑并继续”功能,但现在我经常使用lambda表达式,这个功能就有点用不上了。 - Meta-Knight
2
对于那些在2016年阅读此文的人,你现在可以在VS2015中实现这一点。仍然存在一些限制,但总体来说,他们做得非常好。 - C. Tewalt
3个回答

23

编辑和继续功能可以“实时”更改方法实现,但不能更改类型中的字段。

Lambda表达式(和匿名方法)在捕获变量时可能会创建自己的私有类型。更改Lambda表达式可能会更改涉及的类型,这将破坏编辑和继续功能。

听起来好像应该有可能对代码进行更改而不产生此影响,但我怀疑完全防止它可能更容易——这也意味着您不会开始进行更改,然后发现您中途被阻止。

(个人而言,我本来就不喜欢编辑和继续功能,所以我从未注意到它。)


4
谢谢。你为什么不喜欢E&C?你做什么替代? - Shaul Behr
10
我更喜欢使用单元测试。这样我就不需要担心重新启动 - 这意味着我始终在使用新鲜的代码从头到尾。 - Jon Skeet

0

我不确定,但我的猜测是在涉及到被提升到类中的局部变量时,需要弄清楚哪些内容需要更改的复杂性。我猜想,在这一点上,确定什么更改是安全的,什么更改是不安全的被认为是过于复杂和容易出错的。2010年的工具集侧重于线程和新UI - 也许我们会在下一个版本中得到它。


为什么?只要不调试方法本身,您会认为会发出一些新的IL代码,当需要时JIT就会执行它。这不像C ++那样,即使您认为它必须更加努力地工作,E&C也可以正常工作。 - gbjbaanb

0

我不确定,但我认为这与编译器将形成闭包的lambda表达式转换为编译器生成的类的方式有关。可能没有(简单的)方法应用于编译后的代码所做的更改并保留当前状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接