C# 在没有安装代码契约的情况下生成时,契约会发生什么情况?

C# 在没有安装代码契约的情况下生成时,契约会发生什么情况?,c#,.net,code-contracts,C#,.net,Code Contracts,在我们的项目中,我们定义了两个三个构建配置:发布、调试和“调试+契约”。这些定义如下: <PropertyGroup Condition="'$(Configuration)' == 'Release'"> <Optimize>true</Optimize> <DebugType>pdbonly</DebugType> </PropertyGroup> <PropertyGroup Condition="'$(

在我们的项目中,我们定义了两个三个构建配置:发布、调试和“调试+契约”。这些定义如下:

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <Optimize>true</Optimize>
  <DebugType>pdbonly</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
  <DefineConstants>TRACE;DEBUG</DefineConstants>
  <DebugType>full</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Debug-plus-contracts'">
  <DefineConstants>TRACE;DEBUG;CONTRACTS_FULL</DefineConstants>
  <CodeContractsEnableRuntimeChecking>True</CodeContractsEnableRuntimeChecking>
  <CodeContractsRuntimeThrowOnFailure>False</CodeContractsRuntimeThrowOnFailure>
  ...

真的
pdbonly
痕迹;调试
满的
痕迹;调试;合同已满
真的
假的
...
我们定义了两种调试配置,因为“debug plus contracts”只构建在安装了

我的问题是,像
Contract.Requires(source.Any())
这样的行在每个配置中编译时会发生什么?假设它在运行时被违反,在哪些配置中会发生任何事情



我这样问是因为我(在某处)听说在调试配置中,
Contract.Requires
被编译为
Debug.Assert
。但有证据表明这不是真的,我们有一些
契约。Requires
在Debug plus中失败,但在Debug中没有失败。

契约。Requires
声明为

这意味着如果未定义
CONTRACTS\u FULL
符号,编译器将完全删除对
Requires
的任何调用。根本不会执行检查

如果您确实定义了
CONTRACTS\u FULL
符号,但在构建时没有安装代码契约或没有使用其重写器,那么对
Requires
的任何调用都将抛出异常,无论检查是否通过,都会告诉您,如果没有代码契约重写器,它将无法工作


注意:这与
合同不同。需要
。后者没有相同的
条件属性
,因此在任何配置中都会失败,除非使用代码契约重写器。

(+1)请注意,此答案中的“您没有安装代码契约”指的是生成机器。当然,您不需要在客户的机器上安装代码契约。另外请注意,一般情况下,您应该选择汇编模式“标准合同要求”,而不是“自定义参数验证”(不幸的是,这似乎是默认设置)。@MatthewWatson您完全正确,我编辑了我的答案,希望能更清楚一点。
[ConditionalAttribute("CONTRACTS_FULL")]
public static void Requires(
  bool condition
)

[ConditionalAttribute("CONTRACTS_FULL")]
public static void Requires(
  bool condition,
  string userMessage
)