2016-01-20 56 views
4

我从原始网站安装了代码合同,并试图编写一些示例代码。但R#只是写了Method invocation is skipped。当我观察反编译源时,我发现该方法是有条件的:必须定义CONTRACTS_FULL常量。我在项目设置中检查了Code Contracts选项卡中的所有内容,但似乎不起作用。如何正确使用代码合同?

怎样才可以解决吗? enter image description here

回答

4

user documentation(PDF)这样说:

2合同

大多数的合同类的方法是条件编译,意味着编译器只发出这些方法的调用,当一个特殊符号,全 - 合同符号,被定义。那个符号是CONTRACTS_FULL。这允许在不使用#ifdef的情况下在代码中编写合同,但是产品的版本不同,有些使用合同,有些则不使用。

如果您正在使用Visual Studio 2008或更高版本(第6章)或的MSBuild(A.1节),那么你就需要自己定义这个符号。相反,当您使用提供的UI启用运行时或静态检查(或项目中的属性或msbuild参数中定义的/ p)时,构建会自动定义此符号并执行适当的重写操作。如果您使用自己的构建机制,则需要定义完整合约符号,如果您希望将合约发射到您的装配中供工具进一步使用。

所以代码合同方法是有条件编译的,基于CONTRACTS_FULL的存在。

如果检查Perform runtime contract checkingPerform static contract checking然后Visual Studio将确保CONTRACTS_FULL定义,但作为传递到构建过程,而不是在项目定义的常量的参数。因此,检查这些框是您打开合同检查所需的全部内容。 (另一种方法是选中这些复选框,以便在项目中定义CONTRACTS_FULL常量,但在保持文本字段及其两个复选框同步时会出现问题。)

因此,就其他任何其他工具(包括Resharper)而言,Contract中的方法以未定义的常量为条件。您可以忽略警告或手动定义常量。

-1

“条件常数”(更恰当:“条件编译符号”)设置(或定义)项目属性的生成选项卡。

在“条件编译符号”文本字段中只需输入“CONTRACTS_FULL”和你所有的设置。

+2

到目前为止,我确定'Perform Runtime Checking'选项定义了这个常量... –