0

我试图跟上代码合同的速度。这是另一个对我来说没有意义的问题:

这是不变量:

[ContractInvariantMethod]
    void Invariant() {
        Contract.Invariant(this._uiRoot.RowDefinitions!=null);
    }

然后,在一个方法中是这样的代码:

int colunmn = 0;
foreach (UIElement uiElement in row.Where(element => element!=null))
{
            if (uiElement != null)
            {
                uiElement.SetValue(Grid.ColumnProperty, colunmn++);
                uiElement.SetValue(Grid.RowProperty, _uiRoot.RowDefinitions.Count - 1);
                _uiRoot.Children.Add(uiElement);
            }
}

然后我收到一个警告,即 _uiRoot.RowDefinitions 可能为空,尽管有不变量。我不明白为什么 CodeContracts 会认为,如果在每个公共方法调用和构造函数之后检查它。有问题的代码是一个自定义表单设计器,它在许多不同的方法中使用 uiRoot.RowDefinitions,这就是我想将它放入 Invariant 的原因。我认为这足以阻止它的警告。

4

1 回答 1

1

我认为不变式只在公共财产访问上运行。是否可以将合同添加到 RowDefinitions 属性本身?您的不变量不能证明该属性不会为空;您可以在该类型上调用一个方法,在您的不变量运行后将其设置为 null。

于 2013-06-13T01:24:13.487 回答