我不明白这条消息试图告诉我的事情:
CodeContracts: invariant unproven: _uiRoot != null && _uiRoot.Children != null && _uiRoot.RowDefinitions != null && _uiRoot.ColumnDefinitions != null
这是方法:
private void AddRowToGrid(List<UIElement> row) {
Contract.Requires(row != null);
_uiRoot.RowDefinitions.Add(new RowDefinition());
VerifyColumnCount(row.Count);
int colunmn = 0;
foreach (UIElement uiElement in row.Where(element => element != null))
{
if (uiElement != null)
{
uiElement.SetValue(Grid.ColumnProperty, colunmn++);
if (_uiRoot.RowDefinitions != null)
{
uiElement.SetValue(Grid.RowProperty, _uiRoot.RowDefinitions.Count - 1);
if (_uiRoot.Children != null)
{
_uiRoot.Children.Add(uiElement);
}
}
}
}
}
这是不变量:
[ContractInvariantMethod]
private void ObjectInvariant() {
Contract.Invariant(_layoutList != null && this._layoutList.DefaultLayoutItemEntities != null);
Contract.Invariant(_uiRoot != null && _uiRoot.Children != null && _uiRoot.RowDefinitions != null &&
_uiRoot.ColumnDefinitions != null);
Contract.Invariant(_dragDropManager != null);
}
我尝试添加以下Contract.Ensures,但它仍然给我相同的信息:
Contract.Ensures(_uiRoot != null && _uiRoot.Children != null && _uiRoot.RowDefinitions != null &&
_uiRoot.ColumnDefinitions != null);
答案 0 :(得分:1)
我所学到的是为了证明静态分析仪的正确性,您需要有一个签入代码,例如:
if(_uiRoot == null || _uiRoot.Children == null || _uiRoot.RowDefinitions == null ||
_uiRoot.ColumnDefinitions == null)
throw new Exception();
分析仪将看到这一点,并确定这是Contact.Ensures的证据。
另一种选择是使用:
Contract.Assume(_uiRoot != null && _uiRoot.Children != null && _uiRoot.RowDefinitions != null &&
_uiRoot.ColumnDefinitions != null);
这将告诉分析器Contract.Ensure已经过验证,并且在运行时,如果启用了运行时检查,它将验证它是否为真。
更好的是编写代码,以便分析器可以通过分析代码本身来证明。这对我来说是代码合同的最大好处 - 代码证明了自己,因为它写得很好。
Greg