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
돌이 를 주석 처리하면 , 그것은 분명히 우리가 컬렉션을 변경했기 때문입니다.
이제 주석 처리를 제거하면 왜이 루프에서 두 항목을 추가 할 수 있습니까? 30 분 (펜티엄 CPU에서)처럼 실행하는 데 시간이 걸리지 만 던지지 않으며 재미있는 점은 다음과 같이 출력된다는 것입니다.
약간의 예상 이었지만 우리가 변경할 수 있다는 것을 나타내며 실제로 컬렉션을 변경합니다. 이 문제가 발생하는 이유는 무엇입니까?
2
그 흥미 롭군요. 동작을 재현 할 수는 있지만 내부 루프를 Int.MaxValue에서 100과 같은 값으로 변경하면 불가능합니다
—
Steve
얼마나 기다렸습니까?
—
오랜
int.MaxValue
반복 을 완료하는 데 꽤
foreach는 각 루프의 시작 부분에서 컬렉션이 수정되었는지 확인하기 위해 확인한다고 생각하므로 각 루프 내에서 항목을 추가 한 다음 제거해도 오류가 발생하지 않습니다.
—
Kaz
참조 소스 를보고 변경 감지 작동 방식을 확인 하여이 질문에 직접 답할 수 있었을 것 입니다. 모두가 참조 소스도 단지 :) 단어를 확산, 존재 알고있다
—
크리스토퍼 Currens
호기심 때문입니다. 실제 코드에서이 문제가 발생 했습니까?
—
ken2k 2014