1

次のようなコードがあります。

type
  TMyDictionary = TDictionary<int, int>;

var
  myDict: TMyDictionary;
  k, v: integer;

  // code to fill the dictionary

  for k in myDict.Keys do
  begin
     v := myDict.Items[k];

     // other stuff
  end;

ランダムに、「v := myDict.Items[k];」でスローされる例外が表示されます。これは、k が無効であることを示しています。

他の誰かがこれを見ましたか?

4

3 に答える 3

1

myDictというラベルの付いたセクション内を変更しています// other stuffか?

于 2009-03-12T15:49:53.293 に答える
1

CodeCentral を見ると、TDictionary、特に for ... in ... 構造をサポートする列挙子に対して多くのバグが発生しているのがわかります。

于 2009-03-20T14:56:10.150 に答える
0

ローカル変数のみを使用して、1 つのメソッドでこの問題を再現してみてください。

2 つの異なるスレッドから変数を使用しているか、myDict の要素を更新している可能性があります。

それをもっと再現することについての私の答えを説明しようとします:

別のコンピューターで実行できるメソッドを 1 つ作成し、発生しているエラーを表示する必要があります。

たとえば (質問: ゼロ除算の例外が発生します):

var
   i : integer;
begin
   i := 3;
   while (i <= 0) do
   begin
     Writeln(FloatToStr(20/i));
     Dec(i);
   end;
end

これをコンピューターで実行すると、ゼロ除算の例外が発生します。そのため、問題を再現できました。発生している問題を一貫した方法で再現するために、できるだけ単純なスニペットを作成してみてください。

于 2009-03-12T15:53:22.770 に答える