使用ILspy代码是:
private void EnsureCapacity(int min)
{
if (this._items.Length < min)
{
int num = (this._items.Length == 0) ? 4 : (this._items.Length * 2);
if (num > 2146435071)
{
num = 2146435071;
}
if (num < min)
{
num = min;
}
this.Capacity = num;
}
}
为什么检查num是否大于2146435071,特别是它不应该只检查下溢&amp; set num = Int.Max或任何大于min的值?
答案 0 :(得分:5)
这与事实有关,List<T>
使用数组作为内部存储,最大数组大小设置为2146435071
。
阅读有关数组最大大小的What is the maximum length of an array in .NET on 64-bit Windows。
您可以轻松创建自己的IList<T>
实现,该实现不会将数组用作内部存储,并且将允许超过2146435071
个元素。当然,由于int.MaxValue
会返回IList<T>.Count
,因此您仍被int
限制为最大元素数。