我有一个特殊的方法偶尔会崩溃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&lt;&gt; .AddRange()应根据需要自动调整大小:
如果新的Count(当前Count加上集合的大小)将大于Capacity,则List&lt;(Of&lt;(T&gt;)&gt;)的容量会通过自动重新分配来增加内部数组以容纳新元素,并在添加新元素之前将现有元素复制到新数组。
有人会想到AddRange可能会抛出此类异常的情况吗?
编辑:
回答有关FindObjects()方法的问题。它基本上看起来像这样:
List<MyObject> retObjs = new List<MyObject>();
foreach(MyObject obj in objectList)
{
if(someCondition)
retObj.Add(obj);
}
答案 0 :(得分:20)
您是否尝试从多个线程更新相同的列表?这可能会导致问题... List<T>
对多个作者来说并不安全。
答案 1 :(得分:0)
老实说,我不确定,但为什么不删除列表初始化中的大小声明?
List`<MyType>` list = new List`<MyType>`