BigInteger 最大长度

.NET 9 强制实施的最大长度限制为 BigInteger,即最多可以包含 (2^31) - 1(约 21.4 亿)位。 这样的数字代表了近 256 MB 的分配,包含约 6.465 亿位数字。 这一新的限制确保所有公开的 API 都表现良好且一致,同时仍允许远远超出大多数使用场景的数字。

旧行为

以前可以将长度最多为 Array.MaxLength * 32 位的值分配给 BigInteger 变量。

注意

典型的计算机在达到此限制之前早就达到 OutOfMemoryException 限制了。

新行为

从 .NET 9 开始,BigInteger 的最大长度为 (2^31) - 1(约 21.4 亿)位。 如果尝试分配更大的值,则会在运行时引发 OverflowException。 例如,以下代码会引发异常:

BigInteger bigInt = new BigInteger(-1) << int.MaxValue;

引入的版本

.NET 9 预览版 6

中断性变更的类型

此更改为行为更改

更改原因

BigInteger 支持表示基本上可以说是任意长度的整数值。 但在实践中,由于底层计算机的限制(例如可用内存大小或计算给定表达式所需时间),长度受到约束。 此外,有些 API 会迫使生成的值过大的给定输入失败。 由于这些原因,现在强制实施最大长度限制。

如果代码受到影响,请缩短分配给 BigInteger 的值的长度或添加长度检查。

受影响的 API