0

メソッド内に次のコードがあります。

string username = (string)context["UserName"];

string un = (string)context["UserName"];

問題は、最初の文字列「username」が割り当てられていないのに対し、2 番目の文字列は割り当てられていることです。

さらに奇妙なことに、最初の行の後でデバッグを停止し、その行をイミディエイト ウィンドウにコピーして、変数型のデラレーションを削除すると、正常に割り当てられました。

すべてを再構築し、プロジェクトのプロパティを確認しましたが、問題ないようです。

context変数は、System.Configuration.SettingsContextハッシュ テーブルである です。具体的には、プロファイル プロバイダーであるGetPropertyValuesメソッドを実装しています。

VS 2012 と .NET 4.5 を使用しています

編集:

プロジェクトでコード コントラクトを使用しています。これは、ランタイム チェックにコンパイル時のコード インジェクションを使用します。無効にしましたが、すべて正常に機能しています。コントラクトを 1 つずつ削除して、問題の原因となっているコントラクトを特定します。

4

2 に答える 2

0

コントラクトを調査して無効にした後、実行時コントラクトのチェックが有効になっていて、このコントラクトが表示されている場合にのみ問題が発生することがわかりました。

Contract.Ensures(Contract.Result<System.Configuration.SettingsPropertyValueCollection>() != null);

この行を削除するとコードが機能するので、コード コントラクトのバグのように見えますが、テスト プロジェクトでは再現できませんでした。

于 2012-07-31T20:25:20.417 に答える
0

あなたが見ているのは、私が以前見た Code Contracts のバグに似ています。私はそれについて数ヶ月前にここで何かを書きました. このバグがある場合は、メソッドに を使用するラムダ式または LINQ 式も含まれている可能性がありますusername

今後の参考のために、これは私が見たバグです:

同じメソッドに、ローカル変数をキャプチャするラムダ式、たとえば とvalues、まったく関係のないものをチェックする Contract.Requires() 式がありました。そのメソッドをデバッグしている間、デバッガーは Locals に変数を 2 回表示し、明らかにそうでない場合でも常にvaluesの値を null として報告します。values

再現するには:

  static void Reproduction(string argument)
  {
      Contract.Requires(argument != null); // <-- (1)

      int[] values = new int[1];
      Debug.Assert(values != null);

      Func<int, bool> d = i => values[i] >= 0; // <-- (2)

      Console.WriteLine(values);
  }

への割り当ての後にこのメソッドのどこかにブレークポイントを置き、valuesメソッドが呼び出されるようにします。デバッガーがブレークポイントに到達したら、Visual Studio のローカル リストで重複する変数を確認します。マウスを上に移動すると、明らかにそうではないvaluesことが報告されていることがわかります。null

コントラクト (1) またはラムダ (2) を含む行を削除すると、問題はなくなります。

于 2012-08-01T21:15:54.457 に答える