Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A precisão máxima ao formatar números como cadeias de caracteres usando ToString e TryFormat foi alterada de Int32.MaxValue para 999 999 999. (A precisão máxima foi alterada anteriormente para Int32.MaxValue no .NET 6.)
Além disso, o expoente máximo permitido ao analisar uma BigInteger cadeia de caracteres foi limitado a 999.999.999.
Comportamento anterior
No .NET 6, a lógica de análise de formato numérico padrão era limitada a uma precisão igual Int32.MaxValue ou inferior. O comportamento pretendido era lançar um FormatException para qualquer precisão maior do que Int32.MaxValue. No entanto, devido a um bug, o .NET 6 não lançou essa exceção para algumas dessas entradas. O comportamento pretendido foi:
double d = 123.0;
d.ToString("E" + int.MaxValue.ToString()); // Doesn't throw.
long intMaxPlus1 = (long)int.MaxValue + 1;
string intMaxPlus1String = intMaxPlus1.ToString();
Assert.Throws<FormatException>(() => d.ToString("E" + intMaxPlus1String)); // Throws.
Além disso, não havia limite para o tamanho do expoente ao analisar um BigInteger a partir de uma cadeia de caracteres.
Novo comportamento
A partir do .NET 7, o .NET oferece suporte à precisão de até 999.999.999. Um FormatException é lançado se a precisão for superior a 999.999.999. Essa alteração foi implementada na lógica de análise que afeta todos os tipos numéricos.
double d = 123.0;
Assert.Throws<FormatException>(() => d.ToString("E" + int.MaxValue.ToString())); // Throws.
long intMaxPlus1 = (long)int.MaxValue + 1;
string intMaxPlus1String = intMaxPlus1.ToString();
Assert.Throws<FormatException>(() => d.ToString("E" + intMaxPlus1String)); // Throws.
d.ToString("E999999999"); // Doesn't throw.
d.ToString("E00000999999999"); // Doesn't throw.
Além disso, se você tentar analisar um BigInteger com um expoente maior que 999.999.999 de uma cadeia de caracteres, um FormatException será lançado.
Versão introduzida
.NET 7
Tipo de mudança disruptiva
Essa alteração pode afetar a compatibilidade binária.
Motivo da mudança
O comportamento introduzido no .NET 6 visava lançar um FormatException para qualquer precisão maior que Int32.MaxValue. No entanto, devido a um bug, ele não lançou essa exceção para algumas entradas maiores do que o máximo. Essa alteração corrige o bug limitando a precisão a 999.999.999.
Ação recomendada
Na maioria dos casos, nenhuma ação é necessária, porque é improvável que você já esteja usando uma precisão superior a 999.999.999 em suas cadeias de caracteres de formato.
APIs afetadas
Essa alteração foi implementada na lógica de análise que afeta todos os tipos numéricos.
- System.Numerics.BigInteger.ToString(String)
- System.Numerics.BigInteger.ToString(String, IFormatProvider)
- System.Numerics.BigInteger.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int32.ToString(String)
- System.Int32.ToString(String, IFormatProvider)
- System.Int32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt32.ToString(String)
- System.UInt32.ToString(String, IFormatProvider)
- System.UInt32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Byte.ToString(String)
- System.Byte.ToString(String, IFormatProvider)
- System.Byte.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.SByte.ToString(String)
- System.SByte.ToString(String, IFormatProvider)
- System.SByte.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int16.ToString(String)
- System.Int16.ToString(String, IFormatProvider)
- System.Int16.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt16.ToString(String)
- System.UInt16.ToString(String, IFormatProvider)
- System.UInt16.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Numerics.BigInteger.Parse
- System.Numerics.BigInteger.TryParse
- System.Int64.ToString(String)
- System.Int64.ToString(String, IFormatProvider)
- System.Int64.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt64.ToString(String)
- System.UInt64.ToString(String, IFormatProvider)
- System.UInt64.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Half.ToString(String)
- System.Half.ToString(String, IFormatProvider)
- System.Half.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Single.ToString(String)
- System.Single.ToString(String, IFormatProvider)
- System.Single.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Double.ToString(String)
- System.Double.ToString(String, IFormatProvider)
- System.Double.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Decimal.ToString(String)
- System.Decimal.ToString(String, IFormatProvider)
- System.Decimal.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)