C# 将AddRange与空的Generic.List用作参数时,Generic.List引发参数异常

C# 将AddRange与空的Generic.List用作参数时,Generic.List引发参数异常,c#,exception,generic-list,addrange,C#,Exception,Generic List,Addrange,在我的程序中,当尝试使用AddRange函数时,我得到一个未处理的系统。ArgumentException: 目标数组不够长。检查destIndex和length,以及数组的下限 调试时,我会中断行上的异常: ListA.AddRange(ListB); 在调试器的监视工具中,我可以看到: ListA: Count = 2454 ListB: Count = 0 查看通用列表时,ArgumentException未列出 当我试图指出到底出了什么问题时,我是否遗漏了什么?编辑:不要再重复我的文

在我的程序中,当尝试使用
AddRange
函数时,我得到一个未处理的
系统。ArgumentException

目标数组不够长。检查destIndex和length,以及数组的下限

调试时,我会中断行上的异常:

ListA.AddRange(ListB);
在调试器的监视工具中,我可以看到:

ListA: Count = 2454
ListB: Count = 0
查看通用列表时,
ArgumentException
未列出


当我试图指出到底出了什么问题时,我是否遗漏了什么?

编辑:不要再重复我的文章了。这是一个比赛条件。这显然发生在最后的AddRange部分。显然,在生长步骤和实际拷贝期间,两个阵列的大小不同。到了这样的程度,内部数组的增长还不够

覆盖任何一个数组上的所有编写工作的脚本都应该能够解决这个问题

原始答案-可以忽略

你的头衔说明了这一点。由于尝试将空列表添加到现有列表中,因此会出现参数异常。根据AddRange()函数的设计器,这不是有效的操作

有一个非常狭隘的目的:

当提供给方法的参数之一无效时引发的异常

当调用方法且传递的参数中至少有一个不符合被调用方法的参数规范时,将引发ArgumentException。ParamName属性标识无效参数

因为它只有一个目的,所以对于每一个函数调用中可能发生的每一种情况,都不需要特别提及。事实上,你应该被鼓励自己扔掉它

要避免这种情况,请不要将空列表馈送到AddRange()。检查以下各项并不重要:

if(ListB.Lent > 0){
  ListA.AddRange(ListB);
}
由于您提供了0有关如何创建ListB的信息,因此我们无法告诉您为什么它有时是空的。它就是这样,而且很容易检查

我使用这两篇文章作为异常处理的基础:

这个异常非常简单,是一个愚蠢的异常。有一个远程参数表明空列表并不例外。然而,AddRange()的设计者认为它是一个例外,足以避免一个例外。使用基本if也可以很容易地避免它,因此它不能真正归类为令人烦恼的异常。因此,即使考虑了所有因素,这仍然只是一个愚蠢的例外。请停止导致它。

列表
不是线程安全的。发件人:

线程安全 此类型的公共静态(在Visual Basic中共享)成员是线程安全的。任何实例成员都不能保证线程安全

对一个列表执行多个读取操作是安全的,但如果在读取集合时对其进行修改,则可能会出现问题。为确保线程安全,请在读或写操作期间锁定集合。要使集合能够由多个线程访问以进行读写,必须实现自己的同步。有关内置同步的集合,请参阅System.collections.Concurrent命名空间中的类。有关固有的线程安全替代方案,请参见ImmutableList类

从多个线程同时写入
列表
,或者在一个线程上写入
列表
,而在另一个线程上读取,是不安全的。您将看到随机的“无法解释的”异常,就像您看到的一样


使用锁正确同步对列表的访问、使用线程安全集合或重新设计,这样您就不需要执行此操作。

您是否同时从多个线程访问列表?请填写
列表的定义a
?是的,我需要。我会在帖子中添加这些信息。你能解释一下相关性吗?@Anduin你是说它是什么样的列表?它初始化为一个列表,其中MyObject是抽象的,并且有许多不同类型的子对象。是的。这的确很重要。我需要确定它是
列表
还是其他收藏类型。感谢您的帮助。非常感谢。评论不用于长时间讨论;这段对话已经结束。