“合同不能在试块中”是什么意思?

时间:2010-05-21 15:51:35

标签: c# code-contracts

我正在使用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           
}

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

更新

我在你的帮助下想出来了:

  • 转到顶部
  • 检查Contract.Result

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

3 个答案:

答案 0 :(得分:6)

我可能会遗漏一些东西,但我只是看了一下文档:

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

它说:

  

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

因此,只需将Ensures调用放在方法的顶部,就不会出现任何问题。

答案 1 :(得分:3)

这很简单:Contract类通过抛出异常来表示违反合同的行为。把它放在试试块中会使目的失败,你可能会遇到异常。

答案 2 :(得分: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;        
}