var ints = new List< int >( new[ ] {
1,
2,
3,
4,
5
} );
var first = true;
foreach( var v in ints ) {
if ( first ) {
for ( long i = 0 ; i < int.MaxValue ; ++i ) { //<-- The thing I iterate
ints.Add( 1 );
ints.RemoveAt( ints.Count - 1 );
}
ints.Add( 6 );
ints.Add( 7 );
}
Console.WriteLine( v );
first = false;
}
内部for
ループをコメントアウトすると、スローされます。コレクションに変更を加えたためです。
コメントを外した場合、なぜこのループでこれら2つの項目を追加できるのでしょうか。30分ほど(Pentium CPUの場合)のように実行するのには少し時間がかかりますが、スローされず、面白いのは次のように出力されることです。
少し予想通りでしたが、変更できることと実際にコレクションが変更されることを示しています。この動作が発生する理由はありますか?
2
それは面白い。動作を再現できましたが、内部ループをInt.MaxValueから100のような値に変更した場合は不可能でした
—
Steve
どのくらい待った?
—
Jon Skeet
int.MaxValue
イテレーションの完了にはかなり時間がかかります...
foreachは、各ループの最初でコレクションが変更されているかどうかをチェックするので、各ループ内でアイテムを追加してから削除してもエラーは発生しません。
—
Kaz
参照ソースを見て、変更検出がどのように機能するかを確認することで、この質問に自分で答えることができたかもしれません。誰もが参照ソースが存在することさえ知っているわけではなく、単に言葉を広めるだけです:)
—
Christopher Currens 2014年
ちょうど好奇心から:この問題は実際のコードで発生しましたか?
—
ken2k 2014年