6

Microsoft コード コントラクトに 3.5 ライブラリを使用しています

public object RetrieveById(int Id)
{    
    //stuff happens...
    Contract.Ensures(newObject != null, "object must not be null");
    return newProject;
    //No error message if I move the Contract.Ensures to here
    //But it isn't asserting/throwing a contract exception here either           
}

次のコンパイラ メッセージが表示されます。

アップデート:

私はあなたの助けを借りてそれを理解しました:

  • トップに移動
  • Contract.Result と照合する

    Contract.Ensures(Contract.Result() != null, "オブジェクトを null にすることはできません");

4

3 に答える 3

6

何かが足りないかもしれませんが、これに関するドキュメントを見ただけです:

http://msdn.microsoft.com/en-us/library/dd412865.aspx

それは言います:

このメソッド呼び出しは、他のコードよりも前に、メソッドまたはプロパティの先頭にある必要があります。

したがって、Ensures 呼び出しをメソッドの先頭に置いておくだけで問題は発生しません。

于 2010-05-21T15:55:33.210 に答える
3

非常に単純です。Contract クラスは、例外をスローして契約違反を通知します。それを try ブロックに入れると、目的が無効になり、例外をキャッチする可能性があります。

于 2010-05-21T16:21:11.127 に答える
2

同様のソリューションを次に示します。

http://social.msdn.microsoft.com/Forums/en/codecontracts/thread/43f467f1-14b7-4e56-8030-50f842b7ba68

あなたの最近の編集は、Contract.Ensuresステートメントの上にコードがあることを示しています。Contract.Ensuresメソッド内の他のコードの前に置く必要があるため、次のようになります。

public object RetrieveById(int Id)
{    
    //first line of method:
    Contract.Ensures(newObject != null, "object must not be null");

    //stuff happens...

    return newProject;        
}
于 2010-05-21T16:11:27.793 に答える