gpt4 book ai didi

c# - 不一致的行为 : no exception is thrown in the List. 在 foreach 循环中调用时的排序方法

转载 作者:太空狗 更新时间:2023-10-29 19:45:00 33 4
gpt4 key购买 nike

我们知道,如果我们更改 foreach 中的集合循环,抛出如下异常:

InvalidOperationException: Collection was modified; enumeration operation may not execute.

但是有一个方法的行为不同: List<T>.Sort(Comparison<T>) .

例如 ( 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++;
}

版本也在所有其他修改列表的方法中增加。

我的问题是:

  1. 这是一个错误吗?或者这种行为有某种原因?
  2. 如果这是一个错误,为什么多年没有修复?

我记得大约 8-9 年前我曾向 Microsoft 发布过此错误报告,但被拒绝了。现在我再也找不到它了。

最佳答案

这是一个错误,这就是它在最新源代码中修复的原因。

https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/Collections/Generic/List.cs#L986

    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++;
}

可能会有很多类似的错误,除非有人报告并且被认为是非常危险的,否则它们仍然存在,因为它们不是优先事项。

别担心,在List.ForEach中也有类似的bug,不会抛出Modified Exception,我确实报告过,他们拒绝了,但在后续版本中修复了。

关于c# - 不一致的行为 : no exception is thrown in the List<T>. 在 foreach 循环中调用时的排序方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41635772/

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