.NET9中InlineArray大小限制文档与实际行为不符的疑问
关于.NET 9 InlineArray大小限制的问题解答
结论
你遇到的问题是官方文档表述存在歧义,与 runtime 实际执行逻辑不匹配,既不是你的理解错误,也不是 runtime 的 bug。
详细解释
文档表述的真实含义
文档中提到的“1 MiB大小限制”,并非是强制的类型加载限制(不会触发TypeLoadException),而是.NET 9针对内联数组栈分配场景的防护机制:当内联数组总大小超过1 MiB时,JIT会自动将其分配到堆上,避免栈溢出风险——这是一个优化/防护逻辑,而非类型加载阶段的硬性限制。触发
TypeLoadException的真实阈值
你实际遇到的TypeLoadException,对应的是.NET runtime对单个值类型的最大总大小限制,当前这个阈值为128 MiB(即2^27字节)。只有当内联数组的总大小(元素类型大小 × 数组长度)超过这个值时,才会在类型加载阶段抛出该异常。对应你的测试场景
你的测试代码中,[InlineArray(1_048_577)]的ByteBuffer是byte类型数组,总大小为1 MiB + 1字节,远未达到128 MiB的类型加载限制,因此不会抛出异常;而当长度设为2^27时,总大小刚好达到128 MiB,触发了runtime的硬限制,才抛出TypeLoadException。
补充验证
如果要确认栈分配的限制,可以尝试在栈上创建超大内联数组并执行操作,此时会观察到JIT自动切换到堆分配的行为,而非抛出类型加载异常。
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

