【发布时间】:2017-07-19 15:05:20
【问题描述】:
我刚刚遇到一个独特的错误,即实时站点在登录时抛出“索引超出了数组的范围”。我将错误跟踪到从旧项目继承的旧“计时”文件。这是完整的课程
public class TimingObject
{
public DateTime timestamp { get; set; }
public String call { get; set; }
public TimeSpan duration { get; set; }
// create a new timing object starting now
public TimingObject()
{
timestamp = DateTime.Now;
}
public TimingObject(String call)
{
timestamp = DateTime.Now;
this.call = call;
}
public void Stop()
{
List<TimingObject> timings;
if (HttpContextManager.Current.Cache["PageTimings"] == null)
timings = new List<TimingObject>();
else
timings = HttpContextManager.Current.Cache["PageTimings"] as List<TimingObject>;
this.duration = (DateTime.Now - this.timestamp);
timings.Add(this);
HttpContextManager.Current.Cache["PageTimings"] = timings;
}
}
错误是由timings.Add(this) 引发的。为什么在添加一个项目到列表时会抛出Index was out of bounds?
如果列表太大,会发生这种情况吗?它到底有多大?
代码是多余的,已被删除。但我真的很想知道为什么会这样。
【问题讨论】:
-
你确定是错误所在的那一行吗?
-
List<T>的最大大小为int32.MaxValue,即大约 21.47 亿。但是,因为它是一个内部根据需要增长的数组,如果你最终得到一个超过该值除以二加一的大小,如果它要添加另一个项目并需要增加它的大小,它可能会尝试添加一个索引比它可以处理的大。我不太确定那里的逻辑。 -
与 rory 和 David 一起,我很想知道缓存中的内容。也许它是被转换为列表的其他东西。
标签: c# arrays indexoutofboundsexception