首页 > 解决方案 > 容量小于计数的 C# 异常

问题描述

当我在列表中添加一个项目时,我在 C# 中遇到了一个列表异常。我真的看不到那里有任何具体的东西。

tempList.ForEach(tempDis => alloc.ListDistribution.Add(tempDis));

当我悬停alloc.ListDistribution时,调试器告诉我列表中有 6 个项目。如果我尝试扩展这些项目,我有一个例外情况:

源数组不够长。检查 srcIndex 和长度,以及数组的下限。在 System.Array.Copy(数组 sourceArray,Int32 sourceIndex,数组 destinationArray,Int32 destinationIndex,Int32 长度,布尔可靠)在 System.Collections.Generic.List 1.CopyTo(T[] array, Int32 arrayIndex) at System.Collections.Generic.Mscorlib_CollectionDebugView1.get_Items()

我可以看到列表的容量是 4,而计数是 6。所以在系统增加容量时会触发异常。

虽然这对我来说毫无意义,但例外列表中提到的文档存在以下情况:

ArgumentOutOfRangeException 容量设置为小于 Count 的值。

但在备注中指定这不可能发生: Capacity 总是大于或等于 Count。如果在添加元素时 Count 超过了容量,则通过在复制旧元素和添加新元素之前自动重新分配内部数组来增加容量。

知道什么可能导致触发此异常吗?

标签: c#list

解决方案


我确实有多个线程,他们不应该同时访问这些数据,但出于问题的目的,我们应该假设他们这样做

然后修复它,List<T>不是线程安全的。如果两个线程同时添加或删除项目,它的内部计数器就会混乱。当您再次访问列表时,东西会中断,例如使用调试器检查其内容,但它可能会发生以及下一段代码访问它时。

同步您对该列表的访问。

此异常未记录在案,因为在多个线程中使用它不是其支持用法的一部分。


推荐阅读