6

我正在为微软代码合同使用 3.5 库

public object RetrieveById(int Id)
{    
    //stuff happens...
    Contract.Ensures(newObject != null, "object must not be null");
    return newProject;
    //No error message if I move the Contract.Ensures to here
    //But it isn't asserting/throwing a contract exception here either           
}

我收到编译器消息:“方法‘Controller.RetrieveById(System.Int32)’中的 try 块中的错误 18 合同部分

更新:

在您的帮助下,我想通了:

  • 移至顶部
  • 检查 Contract.Result

    Contract.Ensures(Contract.Result() != null, "对象不能为空");

4

3 回答 3

6

我可能遗漏了一些东西,但我只是查看了相关文档:

http://msdn.microsoft.com/en-us/library/dd412865.aspx

它说:

此方法调用必须在方法或属性的开头,在任何其他代码之前。

因此,只需将 Ensures 调用留在方法的顶部,您应该不会遇到任何问题。

于 2010-05-21T15:55:33.210 回答
3

这很简单:Contract 类通过抛出异常来指示违反合同的情况。将它放在 try 块中会破坏目的,您很可能会捕获异常。

于 2010-05-21T16:21:11.127 回答
2

这是一个类似的解决方案:

http://social.msdn.microsoft.com/Forums/en/codecontracts/thread/43f467f1-14b7-4e56-8030-50f842b7ba68

您最近的编辑显示您在Contract.Ensures语句上方有代码。Contract.Ensures必须在您的方法中的任何其他代码之前,所以:

public object RetrieveById(int Id)
{    
    //first line of method:
    Contract.Ensures(newObject != null, "object must not be null");

    //stuff happens...

    return newProject;        
}
于 2010-05-21T16:11:27.793 回答