我们知道,如果在foreach循环中更改集合,将引发以下异常:
InvalidOperationException:集合已被修改;枚举操作可能不会执行。
但是有一种行为不同的方法:List.Sort(Comparison)。
例如(dotnetfiddle.net):
List<int> list = new List<int> { 2, 1 } ;
foreach (int i in list)
{
//list.Sort(Comparer<int>.Default); // InvalidOperationException
//list.Sort(); // InvalidOperationException
list.Sort((a, b) => a.CompareTo(b)); // No exception
Console.WriteLine(i);
}根据referencesource.microsoft.com,我们可以看到在这个特定方法中没有版本增量,而在上面的方法中有一个版本增量:
public void Sort(int index, int count, IComparer<T> comparer) {
...
_version++;
}版本也在修改列表的所有其他方法中递增。
我的问题是:
据我所知,大约8-9年前,我曾向微软发布过这份bug报告,但遭到了拒绝。现在我再也找不到了。
发布于 2017-02-02 07:23:56
这是一个bug,这就是为什么在最新的源代码中修复它的原因。
public void Sort(Comparison<T> comparison) {
if( comparison == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.comparison);
}
Contract.EndContractBlock();
if (_size > 1) {
ArraySortHelper<T>.Sort(_items, 0, _size, comparison);
}
_version++;
}可能会有许多类似的bug,除非有人报告并且被认为是非常危险的,它们仍然存在,因为它们不是优先级。
别担心,List.ForEach中也有类似的错误,它不会抛出修改过的异常,我确实报告了它,他们拒绝了,但是在后续版本中它是固定的。
https://stackoverflow.com/questions/41635772
复制相似问题