代码跳过Contract.Requires

时间:2011-10-13 16:54:05

标签: c# code-contracts invariants

我正在尝试使用c#contract编写此方法...但是在调试时,它完全忽略了Contract.requires和CheckRep()我是否错误地使用了它?

    public Poly Add(Poly q)
    {
        CheckRep();
        Contract.Requires(q != null, "You need to provide a valid non-null Poly.");

        Poly la, sm;

        if (deg > q.deg)
        {
            la = this; sm = q;
        }
        else
        {
            la = q; sm = this;
        }

        int newdeg = la.deg;

        if (deg == q.deg)
        {
            for (int k = deg; k > 0; k--)
            {
                if (trms[k] + q.trms[k] != 0)
                {
                    break;
                }
                else
                {
                    newdeg--;
                }
            }
        }

        Poly r = new Poly(newdeg);

        int i;

        for (i = 0; i <= sm.deg && i <= newdeg; i++)
        {
            r.trms[i] = sm.trms[i] + la.trms[i];
        }
        for (int j = i; j <= newdeg; j++)
        {
            r.trms[j] = la.trms[j];
        }

        return r;
    }

1 个答案:

答案 0 :(得分:3)

必须是:

  public Poly Add(Poly q)
    {
        Contract.Requires(q != null, "You need to provide a valid non-null Poly.");
        CheckRep();

来自MSDN

  1. 此方法调用必须位于方法或属性的开头,而不是任何其他代码。

  2. 此合约向客户展示;因此,它必须仅引用至少与封闭方法一样可见的成员。

  3. 如果要在前提条件失败时抛出异常,请使用此方法代替Contract.Requires(Boolean,String)方法。
  4. 您还必须激活运行时检查。右键单击您的项目 - &gt;属性。单击左侧菜单中的“代码合同”。检查“Perfrom Runtime Contact Checking”