我有以下情况:
public interface ISomething
{
void DoStuff();
//...
}
public class Something : ISomething
{
private readonly ISomethingElse _somethingElse;
//...
public Something (ISomethingElse somethingElse)
{
Contract.Requires(somethingElse != null);
_somethingElse = somethingElse;
}
public void DoStuff()
{
// *1* Please look at explanation / question below
_somethingElse.DoThings();
}
}
在第1行并启用了静态检查器的情况下,我会收到一条警告,指出
_somethingElse
可能为空,如果添加契约(Contract),它将给我错误最好的办法是在这里做什么?我看到的选项包括
极端
Contract.Assume
请注意,该字段是
readonly
,因此在构造函数中设置值后,将无法更改。因此,来自代码契约(Contract)的警告似乎无关紧要。 最佳答案
解释
第3节:契约(Contract)继承user manual的指出,所有前提条件必须在继承/实现链的root方法中定义:
解决方案
在您的情况下,最好的做法是设置一个不变的变量,说明_somethingElse
字段永远不会为空:
[ContractInvariantMethod]
private void ObjectInvariant() {
Contract.Invariant(_somethingElse != null);
}
当然,这总是正确的,因为该字段被标记为readonly
并在构造函数中初始化。但是,静态检查器无法单独推断出它,因此您必须通过该不变式明确地告诉它。您可以选择将后置条件
Contract.Ensures(_somethingElse != null);
添加到构造函数中,但是静态检查器不需要它。关于c# - 代码契约(Contract)[类型]实现接口(interface)方法{Interface.Method}因此无法添加需求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3414586/