.NET 3.5的代码合同搞砸了VS10的调试器

时间:2010-07-07 01:35:21

标签: .net debugging .net-3.5 visual-studio-2010 code-contracts

我最近使用代码合同迁移了大量的手动前置条件测试和异常抛出。我没有升级到.NET 4,而是一直使用Microsoft.Contracts.dll程序集,所以我可以坚持使用.NET 3.5(这是一个.NET 3.5和.NET 4程序集都使用的库) 。我在Visual Studio 2010中设置了合同重写器,合同工作正常。

但是,由于我已经完成了这个转换,我注意到调试器在带有契约的方法中表现得很有趣,特别是在具有ContractInvariantMethod的类中。执行游标似乎并不总是与突出显示的行匹配,一些断点无法被命中,我有一个方法,调试器无法告诉局部变量名称,并显示像CS$1$0000这样的东西。这是在调试版本中。

在.NET 3.5到VS10的Microsoft.Contracts.dll中使用代码合同是否存在已知问题? .NET 4中的代码合同是否会出现类似的问题?

[编辑]这个问题让我在Microsoft Connect上创建了一个错误:https://connect.microsoft.com/VisualStudio/feedback/details/573983/code-contract-rewriting-messes-up-local-variable-names-in-iterator-methods-while-debugging

2 个答案:

答案 0 :(得分:1)

我希望你知道合同重写意味着什么 - 动态生成的额外代码没有任何源代码供编译器锁定。由于CLR具有许多不同的元素,因此调试器根本不会做任何事情或者会混淆很多事情,只有具有广泛影响的全面语言功能才能获得完整调试器支持的预算。例如lambda表达式。

这并不是说提交错误不是出于好的原因,只是当你使用尚未完全开发的方面时,你不应期望任何事情变得更好。早期采用者总是有这样的代价,但也有吹牛的权利: - )

答案 1 :(得分:0)

请记住,代码合同目前不适用于Post条件&多线程。 限制合约只做前提条件重写。 这解决了我们系统中的很多问题。