gpt4 book ai didi

c# - 为什么这段代码抛出 'Collection was modified' ,但是当我在它之前迭代一些东西时,它却没有?

转载 作者:IT王子 更新时间:2023-10-29 03:35:38 25 4
gpt4 key购买 nike

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 循环,它会抛出异常,这显然是因为我们对集合进行了更改。

现在如果您取消注释,为什么这个循环允许我们添加这两项?运行它需要一段时间(在 Pentium CPU 上),但它不会抛出,有趣的是它输出:

Image

这有点出乎意料,但它表明我们可以更改并且它实际上更改了集合。知道为什么会发生这种行为吗?

最佳答案

问题在于 List<T> 的方式通过保留类型为 int 的版本字段来检测修改。 , 在每次修改时增加它。因此,如果您在迭代之间对列表进行了恰好 232 次修改,就检测而言,这些修改将变得不可见。 (它将从 int.MaxValue 溢出到 int.MinValue 并最终回到其初始值。)

如果您几乎更改了代码的任何内容 - 添加 1 或 3 个值而不是 2,或者将内部循环的迭代次数减少 1,那么它将按预期抛出异常。

(这是一个实现细节,而不是指定的行为 - 它是一个在极少数情况下可以作为错误观察到的实现细节。但是,在实际程序中看到它导致问题是非常不寻常的。 )

关于c# - 为什么这段代码抛出 'Collection was modified' ,但是当我在它之前迭代一些东西时,它却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26718990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com