2011-01-04 7 views
5

をコントラクト:条件属性例外は、私は以下のコードにコードの契約を使用するとき、私は例外を取得しています

public void Debug(
      dynamic message1, 
      dynamic message2 = null, 
      dynamic message3 = null, 
      dynamic message4 = null, 
      dynamic message5 = null, 
      dynamic message6 = null) 
    { 
     Contract.Requires(message1 != null, 
      "First Logged Message cannot be null"); 
    } 

私がチェックは実行時に行われるように、プロジェクトの設定を構成しようとしています。

例外はです。 "条件属性を持つため、メソッドRequires 'を動的に呼び出せません。。私はコード契約書を数回読んで検索をいくつか行ったが、条件付き属性がどこから来ているのか分からない。

答えて

11

Requiresメソッドの条件付き属性はConditional("CONTRACTS_FULL")です。契約を有効にしてビルドすると、CONTRACTS_FULLシンボルがコンパイラに渡されます。条件付きメソッドで動的ディスパッチを使用できない理由は、実行時にコンパイルされ、ランタイムにこれらのシンボルをコンパイラに渡す方法がないからです。 (ちょうど推測)。

おそらく、メッセージ1をローカル(非動的)変数、おそらくオブジェクトに割り当てることで、おそらく簡単に解決できます。

 object m1 = message1; 
    Contract.Requires(m1 != null, "First Logged Message cannot be null"); 
+0

これはうまくいきました。ありがとう。 –

1

変数代入を作成するのではなく、同じ問題で実行しましたが、条件条件引き数のオブジェクトにダイナミックをキャストできました。

dynamic message1; 
Contract.Requires((object)message1 != null,"First Logged Message cannot be null"); 
関連する問題