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
循环,则会引发该循环,这显然是因为我们对集合进行了更改。
现在,如果您取消注释,为什么此循环允许我们添加这两项?运行它大约需要半分钟(在奔腾CPU上),但它不会抛出,有趣的是它输出:
有点期望,但是它表明我们可以更改,并且实际上可以更改集合。任何想法为什么这种行为发生?
2
那很有意思。我可以重现该行为,但是如果我将Int.MaxValue的内部循环更改为类似100的值,则无法复制
—
Steve
你等了多久?完成
—
Jon Skeet 2014年
int.MaxValue
迭代需要花一些时间...
我相信foreach会检查集合是否在每个循环的开始都已被修改....因此在每个循环中添加然后删除该项目不会引发任何错误。
—
卡兹(Kaz)2014年
您可以通过查看参考源并查看更改检测的工作原理来自己回答这个问题。并非所有人都知道参考文献的存在,只是散布了一个词:)
—
Christopher Currens 2014年
出于好奇:您是否在实际代码中遇到过此问题?
—
ken2k 2014年