15

在阅读了System.Diagnostics.Contracts.Contract受 Spec# 影响的静态类之后,我激动不已,并立即开始在我的代码中调用Contract.Requires()Contract.Ensures().

我想这只是因为我的代码非常棒且没有错误,直到最近才出现检查这些调用是否确实做了一些事情。一个错误溜走了,我意识到这些调用没有做任何事情!我原以为他们至少会在违反条件但没有这样的运气时抛出异常。

我错过了什么吗?有谁知道这到底是什么意思?

4

3 回答 3

17

MSDN 的合同类页面

您必须使用二进制重写器来插入合同的运行时强制执行。否则,诸如 Contract.Ensures 方法之类的合约只能静态测试,如果违反了合约,则不会在运行时抛出异常。您可以从 MSDN DevLabs 网站上的 Code Contracts 下载二进制重写器 CCRewrite。CCRewrite 附带一个 Visual Studio 加载项,使您能够从项目属性页面激活运行时合同实施。二进制重写器和 Visual Studio 加载项不随 Visual Studio 2010 或 Windows SDK 一起提供。

于 2010-05-21T16:22:18.377 回答
2

扩展 JSBangs 的答案:

您必须在此处选中“执行运行时合同检查”框:

在此处输入图像描述

(我还选中了“静态检查 > 执行静态合同检查”框)

于 2013-09-24T21:13:51.483 回答
0

如果您希望.Requires调用引发错误,您需要在项目设置中设置一个选项或使用.Requires<T>调用

于 2010-05-21T16:23:02.883 回答