Dictionary.Add方法上出现IndexOutOfRangeExpect

本文关键字:IndexOutOfRangeExpect Add 方法 Dictionary | 更新日期: 2023-09-27 18:29:15

在向泛型字典(WinRT C#)添加值时,我收到IndexOutOfRange异常。下面是我的代码和异常的堆栈跟踪。

代码:

if (!data.TryGetValue(index, out cells))
{
   cells = new CellCollection();
   data.Add(index, cells);
}

堆栈跟踪:

在System.Collections.Generic.Dictionary 2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary 2.添加(TKey键,TValue值)

我不希望在添加时出现这种超出范围的异常。我的应用程序仅使用单线程。如果不需要的话,我可以使用GC.Collect()将值添加到字典中,并将其从字典中删除。然后根据需要添加值。

有人能提出解决这一例外的建议吗?

Dictionary.Add方法上出现IndexOutOfRangeExpect

在调用Dictionary<,>.Add期间,有时需要分配一个新的后备阵列,因为Count超过了Dictionary<,>的当前容量。当分配一个新的托管对象(新数组)时,垃圾收集器可能会设置。您的应用程序将"暂停"并进行垃圾收集。然后,在收集垃圾之后,控制将从Add方法内部的位置恢复,并且新的后台数组将填充旧数组中的数据。

但是,根据您对上述问题的评论,您有终结器。必须存在一个不相关的对象(可能是同一类的另一个实例),该对象正在被最终确定。它似乎引用了相同的Dictionary<,>。在终结过程中,您的析构函数代码会更改Dictionary<,>的状态。然后,当主线程在垃圾回收后恢复控制时,Dictionary<,>的状态已经改变,但我们正处于向Dictionary<,>添加一个新元素的过程中。

吸取的教训是:不要编写析构函数(终结器)。如果您仍然这样做,请不要更改从其他地方(即不会收集的"活动"对象)引用的托管对象的状态。

Matthew Watson在回答你的问题时说了这句话。