3

私はコントラクトをコーディングするのにかなり慣れていないので、ここでばかげたことをしただけかもしれません:)

エラーが発生しています

メソッド '##' のコントラクトの潜在的な副作用について評価された式ステートメントが検出されました。(式を Requires、Ensures、または Invariant 呼び出しに入れるつもりでしたか?)

以下の契約を結んでいます

Contract.Requires<ArgumentNullException>(obj != null);
Contract.Requires<ArgumentNullException>(obj.Id != null);

2 回目の契約で失敗していますobj.Id != null(IdGuid)

これで、メソッドで許可されていないことが可能にIdなりました。nullしかし、コード コントラクトでは上記のコンパイル エラーが発生します。メソッド自体は実際には何も返さないため、保証も必要ありません。

ifコントラクトを削除したので、標準チェックをコンパイルして配置できます。しかし、これを引き起こしているのは何ですか?

4

1 に答える 1

2

Id プロパティ自体を[Pure]としてマークする必要があります

これにより、Code Contracts Analyzer に副作用がないことがわかります。

コード コントラクトは、副作用のあるメソッドを呼び出すことを好みません。コード コントラクト チェックを有効にしているかどうかによって、コードの動作が異なります。これは悪いことです。

例:

public Guid Id
{
    [Pure]
    get
    {
        return _id;
    }
}

Idもう 1 つのポイント: Guid の場合、null になる可能性はありますか? Guid は構造体であるため、nullにすることはできません。おそらくnull可能なGuid(つまりGuid?)ですか?

于 2013-03-13T10:27:35.633 に答える