我尝试使用以下代码对检索到的实体启用某种非空检查,以确保它们在执行某些具体业务之前是存在的:
protected T GetRequired<T>(object id)
where T : EntityObject
{
var obj = Get<T>(id);
Contract.Requires<ArgumentNullException>(obj != null);
return obj;
}
但在编译时,我得到了:
After contract block, found use of local variable 'obj' defined in contract block
我是不是用错了Contract.Requires
?
发布于 2013-07-24 08:57:23
我是不是用错了
Contract.Requires
?
是的,你是。Contract.Requires
是指说明方法(或属性)的先决条件。如果要继续进行方法调用,这些条件必须是真的,否则就违反了约定。
让我们看看您的代码:
var obj = Get<T>(id);
Contract.Requires<ArgumentNullException>(obj != null);
在这里,您试图使用它来确保在方法完成执行(在本例中是Get
方法)之后,某些内容是真的。这将是一个后置条件,为此,您将在Contract.Ensures
的主体Get
中使用
protected T Get<T>(object id) {
Contract.Ensures(Contract.Results<T>() != null);
// get and return result
}
最后,此编译器错误
在契约块之后,发现使用了在合同块中定义的局部变量
obj
。
此消息是以下事实的结果:您不能在契约块之后使用Contract
,并且契约块仅出现在方法主体的顶部。
发布于 2013-07-24 08:54:20
在这里,你似乎想同时做几件事:
应该在输入参数上直接使用Contract.Requires
,例如,如果id
永远不为null,那么就这样做:
Contract.Requires<ArgumentNullException>(id != null);
此外,您似乎希望保证结果不是null。这样做:
Contract.Ensures(obj != null);
类似地,辅助方法(Get
)也可以检查其他契约。
https://stackoverflow.com/questions/17840172
复制相似问题