我有以下情况:

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/

    10-13 03:09