我从原始网站安装了代码合同,并尝试编写一些示例代码。但是R#只写了Method invocation is skipped
。当我看反编译的源时,我看到该方法是有条件的:必须定义CONTRACTS_FULL
常量。我在项目设置中检查了Code Contracts
标签中的所有内容,但它似乎无法正常工作。
答案 0 :(得分:5)
user documentation(pdf)说:
2份合同
合同类的大多数方法都是有条件编译的,这意味着只有在定义了特殊符号(全合同符号)时,编译器才会发出对这些方法的调用。该符号为
CONTRACTS_FULL
。这允许在不使用#ifdef的情况下在代码中编写合同,但产品不同的构建,一些包含契约,一些没有。如果您使用的是Visual Studio 2008或更高版本(第6节)或msbuild(第A.1节),则无需自行定义此符号。相反,当您使用提供的UI启用运行时或静态检查(或项目中的属性或msbuild参数中的/ p定义)时,构建会自动定义此符号并执行适当的重写操作。如果您使用自己的构建机制,那么如果您希望将合同发送到程序集中以供工具进一步使用,则需要定义完全合同符号。
因此,根据CONTRACTS_FULL
的存在,有条件地编译代码合同方法。
如果选中Perform runtime contract checking
或Perform static contract checking
,则Visual Studio将确保定义CONTRACTS_FULL
,但作为参数传递给构建过程而不是项目中定义的常量。因此,您需要检查这些框以打开合同检查。 (替代方法是使那些复选框导致在项目中定义CONTRACTS_FULL
常量,但是在保持文本字段及其两个复选框保持同步时会遇到问题。)
因此,就任何其他工具(包括Resharper)而言,Contract
中的方法是以未定义的常量为条件的。您可以忽略警告或手动定义常量。
答案 1 :(得分:-1)
“条件常量”(更恰当地说:“条件编译符号”)在“项目属性”的“构建”选项卡中设置(或定义)。
只需在“条件编辑符号”文本字段中输入“CONTRACTS_FULL
”,即可全部设置。