2013-06-12 53 views
0

我想盡快熟悉Code Contracts。這裏是另一個問題是沒有意義對我說:爲什麼CodeContract有關空引用的警告,當ObjectInvariant檢查爲空時

這是不變的:

[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可能爲null。我不明白爲什麼CodeContracts會認爲如果在每個公共方法調用和構造函數之後檢查它。有問題的代碼是一個自定義的表單設計器,它在許多不同的方法中使用uiRoot.RowDefinitions,這就是爲什麼我想將它放入Invariant中的原因。我認爲這足以阻止它的警告。

+0

只是一個猜測,但也許爲'_uiRoot!= null'做一個單獨的不變量 –

回答

1

我認爲不變只能在公共財產訪問上運行。是否有可能向RowDefinitions屬性本身添加合約?你的不變量不能證明財產不會爲空;你可以調用這個類型的方法,在你的不變量運行後將它設置爲null。

相關問題