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

古いバージョンの CodeContracts ではContract.ForAll()メソッドがサポートされていなかったことに気付きましたが、今では (ver 1.4.40602.0) サポートされると思いましたか? ここで何か間違ったことをしているだけですか、それともまだサポートされていませんか?

4

2 に答える 2

2

CCオプションで「警告レベル」が「低」に設定されている警告はありません。値を「high」に設定すると、警告が表示されます。

私は試しましたが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を使用しています:VS2010 SP1で1.4.40602.0)

アップデート

アレイで動作しました。

Collectionたぶん、ユダ・ヒマンゴはとの契約の欠如について正しいですList

于 2011-12-09T19:33:23.307 に答える
2

私は、CodeContracts ビットが言語とフレームワークの統合の欠如に悩まされていることを発見しました。

この場合、渡されたコレクションは明らかに条件を満たしていますが、C# 言語統合の欠如 (コード コントラクトは C# 経由で空のコレクションを渡していることを認識していません)、または .NET フレームワークの欠如のいずれかが原因です。統合 (Collection クラスにはコード コントラクトの注釈が付けられていません)。

于 2011-12-09T19:03:28.060 に答える