当ObjectInvariant检查null时,为什么CodeContract警告null引用?
本文关键字:null 警告 CodeContract 引用 为什么 ObjectInvariant 检查 | 更新日期: 2023-09-27 18:18:01
我正在努力跟上代码合同的速度。这是另一个我不明白的问题:
这是不变量:
[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。行定义可以为空,尽管有不变量。我不明白为什么CodeContracts会认为,如果它是在每个公共方法调用和构造函数之后检查。所讨论的代码是一个自定义表单设计器,它使用uiRoot。RowDefinitions在许多不同的方法中,这就是为什么我想把它放在Invariant中。我想这样就可以停止上面的警告了
我认为不变量只运行在公共属性访问上。是否有可能将契约添加到RowDefinitions属性本身?你的不变式不能证明属性不为空;您可以在该类型上调用一个方法,该方法在您的不变式运行后将其设置为null。