我正在使用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,“对象不能为空”);
答案 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;
}