Comprimento máximo BigInteger
O .NET 9 impõe um comprimento máximo de , que é que ele não pode conter mais do BigIntegerque (2^31) - 1
(aproximadamente 2,14 bilhões) bits. Tal número representa uma alocação de quase 256 MB e contém aproximadamente 646,5 milhões de dígitos. Esse novo limite garante que todas as APIs expostas sejam bem comportadas e consistentes, ao mesmo tempo em que permite números muito além da maioria dos cenários de uso.
Comportamento anterior
Anteriormente, era possível atribuir um valor com um comprimento até Array.MaxLength * 32
bits a uma BigInteger variável.
Nota
As máquinas típicas atingiriam muito OutOfMemoryException antes que esse limite pudesse ser atingido.
Novo comportamento
A partir do .NET 9, BigInteger tem um comprimento máximo de (2^31) - 1
(aproximadamente 2,14 bilhões) bits. Se você tentar atribuir um valor maior, um OverflowException será lançado em tempo de execução. Por exemplo, o código a seguir gera uma exceção:
BigInteger bigInt = new BigInteger(-1) << int.MaxValue;
Versão introduzida
.NET 9 Visualização 6
Tipo de mudança de rutura
Esta mudança é uma mudança comportamental.
Razão para a alteração
BigInteger suporta a representação de valores inteiros de comprimento essencialmente arbitrário. No entanto, na prática, o comprimento é limitado por limites do computador subjacente, como memória disponível ou quanto tempo levaria para calcular uma determinada expressão. Além disso, existem algumas APIs que falham determinadas entradas que resultam em um valor muito grande. Por estas razões, é agora imposto um comprimento máximo.
Ação recomendada
Se o código for afetado, diminua o comprimento do valor que BigInteger você está atribuindo ou adicione uma verificação de comprimento.