2

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;
    }

我意识到在旧版本的 CodeContractsContract.ForAll()中不支持该方法,但我认为现在(版本 1.4.40602.0)会支持吗?我只是在这里做错了什么还是仍然不受支持?

4

2 回答 2

2

我发现 CodeContracts 位缺乏语言和框架集成。

在这种情况下,您传入的集合显然通过了条件,但要么是由于缺乏 C# 语言集成(代码合同不理解您通过 C# 传入一个空集合),要么是缺少 .NET 框架集成(Collection 类未使用代码协定进行注释)。

于 2011-12-09T19:03:28.060 回答
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));
}

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

更新

使用数组。

也许,Judah Himango 关于CollectionList.

于 2011-12-09T19:33:23.307 回答