2011-12-09 15 views
2

Warning 1 CodeContracts: requires unproven: Contract.ForAll(coll, item => item != null) C:\MyApp\MyObj.cs代碼合同1.4.40602.0 - Contract.ForAll似乎沒有工作?

public MyObj() 
     : this(new Collection<Object>()) { } 

    public MyObj(ICollection<Object> coll) 
    { 
     Contract.Requires<ArgumentNullException>(coll != null); 
     Contract.Requires<ArgumentException>(Contract.ForAll(coll, item => item!= null)); 

     _coll = coll; 
    } 

我意識到,在舊版本CodeContracts的是不支持Contract.ForAll()的方法,但我現在想通過(版本1.4.40602.0)會是誰?我在這裏做錯了什麼,還是仍然不支持?

+1

不好意思,但是叫'CompositeConverter(ICollection )'的代碼在哪裏呢?警告必須與呼叫地點相關。請發佈它。 –

+0

@Pavel Gatilov:對不起,當我複製/粘貼我完全混淆了我的代碼失敗。我修好了它。目前沒有代碼調用創建一個新的'MyObj'。 –

回答

2

在CC選項中,我沒有將'警告級別'設置爲'低'的警告。隨着值設置爲'高'我得到了警告。

我試過System.Collections.ObjectModel.Collection<T>System.Collections.Generic.List<T>,兩者都給出相同的警告。

我試過構造函數和常規方法調用 - 沒有區別。

我已經試過

public MyObj() : this(new List<Object>()) { } 

public MyObj() : this(new List<Object>{1}) { } 

,再沒有什麼區別。

執行常規方法調用時提取變量也無濟於事。

即使Assume沒有幫助:

public void M1() 
{ 
    var list = new List<Object> 
    { 
     1 
    }; 
    Contract.Assume(Contract.ForAll(list, t => t != null)); 
    this.X(list); // Still gives warning on the ForAll requirement 
} 

public void X(ICollection<object> c) 
{ 
    Contract.Requires<ArgumentNullException>(c != null); 
    Contract.Requires<ArgumentException>(Contract.ForAll(c, x => x != null)); 
} 

(我使用的是相同的CC:1.4.40602.0在VS2010 SP1)

UPDATE

有過合作。

也許,猶大Himango是正確的關於CollectionList缺乏合同。

+0

我猜這個版本的靜態檢查器在'Contract.ForAll'方面仍然不能很好地工作。 –

+0

@ m-y我已經設法找到一個工作集合 - 一個數組。雖然我懷疑它使'ForAll'的靜態驗證有用。 :) –

2

我發現CodeContracts位缺乏語言和框架集成。

在這種情況下,您傳遞的集合清楚地傳遞了條件,但要麼是由於缺少C#語言集成(代碼合同不理解您正在通過C#傳遞一個空集合),要麼缺乏.NET框架集成(Collection類沒有用代碼合同註釋)。