List<T> AddRange 抛出 ArgumentException

问题描述 投票:0回答:2

我有一个特殊的方法,偶尔会因

ArgumentException
而崩溃:

Destination array was not long enough. Check destIndex and length, and the array's lower bounds.:
at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
at System.Collections.Generic.List`1.CopyTo(T[] array, Int32 arrayIndex)
at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection)
at System.Collections.Generic.List`1.AddRange(IEnumerable`1 collection)

导致此崩溃的代码如下所示:

List<MyType> objects = new List<MyType>(100);
objects = FindObjects(someParam);
objects.AddRange(FindObjects(someOtherParam);

根据 MSDN,List<>.AddRange() 应根据需要自动调整自身大小:

如果新的Count(当前的Count加上集合的大小)将大于Capacity,则通过自动重新分配内部数组以容纳新元素和现有元素来增加List的容量<(Of <(T>)>)在添加新元素之前复制到新数组。

有人能想到 AddRange 可以抛出此类异常的情况吗?


编辑:

回答有关 FindObjects() 方法的问题。它基本上看起来像这样:

List<MyObject> retObjs = new List<MyObject>();

foreach(MyObject obj in objectList)
{
   if(someCondition)
       retObj.Add(obj);
}
c# exception list
2个回答
21
投票

您是否尝试从多个线程更新同一列表?这可能会导致问题...

List<T>
对于多个作家来说不安全。


0
投票

老实说,我不确定,但为什么不删除列表初始化中的大小声明呢?

List`<MyType>` list = new List`<MyType>`
© www.soinside.com 2019 - 2024. All rights reserved.