[英]Code Contracts 1.4.40602.0 - Contract.ForAll doesn't seem to be working?
Warning 1 CodeContracts: requires unproven: Contract.ForAll(coll, item => item != null) C:\\MyApp\\MyObj.cs
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)可以嗎? 我是在這里做錯什么還是還是不支持?
我發現CodeContracts位缺少語言和框架集成。
在這種情況下,您要傳遞的集合顯然可以通過條件,但是由於缺少C#語言集成(代碼協定無法理解您要通過C#傳遞空集合)或缺少.NET框架集成(Collection類未附帶代碼契約)。
我沒有在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));
}
(我在VS2010 SP1上使用相同的CC:1.4.40602.0)
UPDATE
使用數組。
也許Judah Himango對Collection
和List
缺乏合同是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.