0

これは静的 int メソッドの一部です。

int answer = 0;
foreach(int getal in savedNumbers)
{
    Console.WriteLine(getal);
    answer = answer + getal;
    savedNumbers.Clear(); // after this line, I'm getting an error.
}
return answer;

助けてください...その行でsavedNumbers.Clear()が機能しない理由がわかりません。

編集:ありがとう、問題は解決しました。

4

5 に答える 5

2

You can't modify the collection while enumerating over it. したがって、例外は有効です。列挙が終わったらクリアします。

于 2012-10-14T18:14:10.327 に答える
0

同じリストを繰り返している間はリストを変更できません。

于 2012-10-14T18:13:32.990 に答える
0

列挙の途中でリストをクリアしています。列挙中はリストを変更できません。

int answer = 0;
foreach(int getal in savedNumbers)
{
    Console.WriteLine(getal);
    answer = answer + getal;
}
savedNumbers.Clear(); 
return answer;
于 2012-10-14T18:13:35.390 に答える
0

反復中にリスト/コレクションを変更することはできませんが、以下に示すようにループを使用して同じことを行うことができます。

for (int i = 0 i < savedNumbers.Count; i++)
{
    var getal = savedNumbers[i];
    Console.WriteLine(getal);
    answer = answer + getal;
    savedNumbers.Clear();
}

列挙中にコレクションを変更することはできません。そのルールは、スレッドの問題を考慮しなくても存在します。MSDNから:

コレクションが変更されない限り、列挙子は有効なままです。要素の追加、変更、または削除などの変更がコレクションに加えられた場合、列挙子は回復できないほど無効になり、その動作は未定義になります。

参考文献:

  1. .NET ディクショナリを列挙しながら変更する
  2. コレクションを列挙すると例外がスローされるのに、そのアイテムをループすると例外がスローされないのはなぜですか?
于 2012-10-14T18:14:43.690 に答える
0

Msdnのコメント: foreach ステートメントは、コレクションを反復処理して必要な情報を取得するために使用されますが、予期しない副作用を避けるために、コレクションの内容を変更するために使用しないでください。

于 2012-10-14T18:14:50.337 に答える