4

このコントラクトを以下に記述すると、Visual Studio でエラーが表示されます。

Error 20 Malformed contract section in method '....get_Page'

問題はifブロック?

public int? Page
{
  get
  {
    int? result = Contract.Result<int?>();

    if (result != null)
        Contract.Ensures(result >= 0);

    return default(int?);
  }
}

編集

Lasse V. Karisen はコメントに投稿しました:

どうですか: Contract.Ensures(result == null || result >= 0);?

はい、Karisen、以前にこれを試してみましたが、コンパイルされました。しかし、疑問が残ります:ifコントラクトを使用するときに s を持つことはできないのでしょうか?

私が抱えている別の問題は無知です(主に上記の例が機能することを考慮して)、結果の使用も含まれます:

public int IndexOf(T item)
{
    Contract.Assert(item != null);
    Contract.Assert((item as IEntity).ID > 0);

    int result = Contract.Result<int>();
    Contract.Ensures(result >= -1);

    return default(int);
}
4

5 に答える 5

10

すべてのコントラクト句は他のコードの前に表示される必要があるため、コントラクトの形式が正しくありません。

于 2012-04-02T16:59:28.617 に答える
2

ifは必要ありません。代わりに、ブーリアン操作を行うには、暗黙的に使用します。

public int? Page
{
    get
    {
        Contract.Ensures( (result!= null).Implies(result >= 0) );
        var result = ...

        ...


        return result;
    }
}

また、メソッドの引数やその他の前提条件をテストするときに、Requiresnotassertを使用する必要があります。

public int IndexOf(T item)
{
    Contract.Requires(item != null);
    Contract.Requires((item as IEntity).ID > 0);
...
于 2012-02-06T12:17:51.317 に答える
1

推測するだけです。おそらくそうあるべきContract.Ensures(result.Value >= 0)ですか?

于 2009-12-21T01:44:01.997 に答える