当ObjectInvariant将其检查为null时,为什么CodeContract会对空引用发出警告

时间:2013-06-12 21:12:59

标签: c# code-contracts

我试图加快代码合约的速度。这是另一个对我没有意义的问题:

这是不变量:

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

然后,在Method中是这段代码:

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);
            }
}

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

1 个答案:

答案 0 :(得分:1)

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