我只是在阅读 C# 规范和数组创建表达式的部分。在规范中它说:
array-creation-expression:
new non-array-type [ expression-list ] rank-specifiersopt array-initializeropt
new array-type array-initializer
new rank-specifier array-initializer
[剪辑]
表达式列表的维度长度表达式按从左到右的顺序计算。在评估每个表达式之后,将执行到以下类型之一的隐式转换(第 6.1 节):int、uint、long、ulong。选择此列表中存在隐式转换的第一个类型。如果对表达式的求值或随后的隐式转换导致异常,则不会再求值表达式,也不会执行进一步的步骤。
兴奋,我想嗯我还没有看到,让我们尝试一个长尺寸长度:
bool[] bb = new bool[2L + Int32.MaxValue];
bb[int.MaxValue + 1L] = true;
Visual Studio 指着第一行说:
未处理的异常:System.OverflowException:算术运算导致溢出。
请注意,这不是“OutOfMemoryException”。如果我更改我的数组创建表达式并使其更小:
bool[] bb = new bool[Int32.MaxValue];
这次我得到一个“OutOfMemoryException”。我知道 CLR 的整个“没有对象可以大于 2GB”的限制。我的问题是当长度不再可转换为 Int32 时,为什么我会得到一个非常不同的异常(OverflowException 与 OutOfMemoryException)?