Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den maximala precisionen vid formatering av tal som strängar som använder ToString och TryFormat har ändrats från Int32.MaxValue till 999 999 999. (Den maximala precisionen har tidigare ändrats till Int32.MaxValue i .NET 6.)
Dessutom har den maximala exponenten som tillåts vid parsning av en BigInteger från en sträng begränsats till 999 999 999.
Tidigare beteende
I .NET 6 var standardlogik för numerisk formatparsering begränsad till en precision på Int32.MaxValue eller mindre. Det avsedda beteendet var att kasta en FormatException för en noggrannhet större än Int32.MaxValue. Men på grund av en bugg utlöste .NET 6 inte det undantaget för vissa sådana indata. Det avsedda beteendet var:
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.
Dessutom fanns det ingen gräns för exponentstorleken när du parsade en BigInteger från en sträng.
Nytt beteende
Från och med .NET 7 stöder .NET precision upp till 999 999 999. A FormatException utlöses om precisionen är större än 999 999 999. Den här ändringen implementerades i parsningslogik som påverkar alla numeriska typer.
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.
Om du dessutom försöker parsa en BigInteger med en exponent som är större än 999 999 999 från en sträng, utlöses en FormatException .
Version lanserad
.NET 7
Typ av brytande ändring
Den här ändringen kan påverka binär kompatibilitet.
Orsak till ändring
Det beteende som introducerades i .NET 6 var avsett att utlösa en FormatException för alla precisioner som är större än Int32.MaxValue. På grund av en bugg utlöstes dock inte det undantaget för vissa indata som är större än det maximala. Den här ändringen åtgärdar felet genom att begränsa precisionen till 999 999 999.
Rekommenderad åtgärd
I de flesta fall krävs ingen åtgärd eftersom det är osannolikt att du redan använder en precision som är högre än 999 999 999 i dina formatsträngar.
Berörda API:er
Den här ändringen implementerades i parsningslogik som påverkar alla numeriska typer.
- 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)