【问题标题】:How to undefine the symbol CONTRACTS_FULL?如何取消定义符号 CONTRACTS_FULL?
【发布时间】:2013-03-02 13:03:21
【问题描述】:

Visual Studio 会自动定义 CONTRACTS_FULL 符号,如果 您在项目的代码合同选项卡中启用合同检查 属性页。

- C# 5.0 简述(第 518 页)

我想禁用/取消定义该符号,但它没有出现在项目设置中Build 选项卡的Conditional compilation symbols 字段中。

(我对完全禁用代码合同不感兴趣!我只是说将合同检查设置为None 不是解决方案)。

如果重要的话,我想这样做的原因是因为在我的发布版本中我只想抛出Contract.Requires<TException>,而我根本不想抛出ContractException

我发现的一个“解决方案”是将#undef CONTRACTS_FULL 放在每个文件的第一行,它修复了它,但实际上这样做会很糟糕。

(顺便说一句,到目前为止 VS 还没有定义 CONTRACTS_FULL,我必须自己定义它,但我猜有些设置不小心改变了)

【问题讨论】:

    标签: c# c-preprocessor code-contracts preprocessor-directive


    【解决方案1】:

    您不能运行合约工具并取消定义 CONTRACTS_FULL 符号。这些工具取决于所定义的。如果你试图强迫它,什么都不会起作用。这就是我们在 msbuild 脚本中自动定义符号的原因。

    代码合同工具的用户不应手动尝试定义或取消定义 CONTRACTS_FULL 符号,因为它是一个工具控制变量。

    【讨论】:

    • 所以没有办法只抛出Requires<TException> 异常而不抛出ContractException
    • @Ken 好吧,如果你只使用 Requires 合约并运行重写器,那么是的,你永远不会得到 ContractExceptions。另一种方法是将运行时检查级别设置为 ReleaseRequires。
    【解决方案2】:

    我读过那本书,并且有一个只使用 Contract.Requires 的合同级别。这是之前没有的选项,但它肯定在书中那个部分的某个地方。 但是,我无法帮助您对 CONTRACTS_FULL 进行全局取消定义。对不起。我认为尽管在那个合同检查级别它是自动取消定义的。

    编辑:是的,你需要把它放在第一级(ReleaseRequired)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      相关资源
      最近更新 更多