可能重复:
When does a dictionary throw an IndexOutOfRangeException on Add or ContainsKey?
这个很时髦。我无法轻易找到它的底部。在日志中发现异常并挖出一些旧代码。不要问我为什么这样写,因为我不知道。问题实际上是在设置字典的Item时抛出IndexOutOfRangeException的条件。这是事情的样子:
public MyEnum { Undefined = 0, B = 1, C = 2, D = 16, All = B | C | D }
public class MC
{
private int _hashCode;
private int _i;
private MyEnum _e;
public MC(int i, MyEnum e)
{
_i = i;
_e = e;
SetHashCode();
}
private SetHashCode()
{
_hashCode = _i * 31 + (int)e;
}
public override bool Equals(object other)
{
if (!(obj is MC))
{
return false;
}
MC other = (MC)obj;
return ((_i == other._i) && (_e == other._e));
}
public override int GetHashCode()
{
return _hashCode;
}
}
...
var d = new Dictionary<MC, DateTime>();
...
// Create and populate the list of MCs
var mcs = new List<MC>();
...
foreach (MC mc in mcs)
{
...
d[mc] = DateTime.UtcNow; // Pukes here
}
例外是:
System.IndexOutOfRangeException, Source: mscorlib Index was outside the bounds of the array. at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
想法如何让线路失败?不要把你的注意力分散到错误的方向,但我认为Equals和GetHashCode有些可疑但我到目前为止无法证明这一点 - 没有使用单元测试框架的repro。
答案 0 :(得分:3)
您获得的错误通常是由对字典的多线程,非锁定并发访问引起的。
请参阅:When does a dictionary throw an IndexOutOfRangeException on Add or ContainsKey?