在阅读了System.Diagnostics.Contracts.Contract
受 Spec# 影响的静态类之后,我激动不已,并立即开始在我的代码中调用Contract.Requires()
和Contract.Ensures()
.
我想这只是因为我的代码非常棒且没有错误,直到最近才出现检查这些调用是否确实做了一些事情。一个错误溜走了,我意识到这些调用没有做任何事情!我原以为他们至少会在违反条件但没有这样的运气时抛出异常。
我错过了什么吗?有谁知道这到底是什么意思?
在阅读了System.Diagnostics.Contracts.Contract
受 Spec# 影响的静态类之后,我激动不已,并立即开始在我的代码中调用Contract.Requires()
和Contract.Ensures()
.
我想这只是因为我的代码非常棒且没有错误,直到最近才出现检查这些调用是否确实做了一些事情。一个错误溜走了,我意识到这些调用没有做任何事情!我原以为他们至少会在违反条件但没有这样的运气时抛出异常。
我错过了什么吗?有谁知道这到底是什么意思?
您必须使用二进制重写器来插入合同的运行时强制执行。否则,诸如 Contract.Ensures 方法之类的合约只能静态测试,如果违反了合约,则不会在运行时抛出异常。您可以从 MSDN DevLabs 网站上的 Code Contracts 下载二进制重写器 CCRewrite。CCRewrite 附带一个 Visual Studio 加载项,使您能够从项目属性页面激活运行时合同实施。二进制重写器和 Visual Studio 加载项不随 Visual Studio 2010 或 Windows SDK 一起提供。
扩展 JSBangs 的答案:
您必须在此处选中“执行运行时合同检查”框:
(我还选中了“静态检查 > 执行静态合同检查”框)
如果您希望.Requires
调用引发错误,您需要在项目设置中设置一个选项或使用.Requires<T>
调用