Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De maximale precisie voor het formatteren van getallen als tekenreeksen met behulp van ToString en TryFormat is veranderd van Int32.MaxValue naar 999.999.999. (De maximale nauwkeurigheid is in het verleden gewijzigd naar Int32.MaxValue in .NET 6.)
Bovendien is de maximale exponent die is toegestaan bij het parseren van een BigInteger tekenreeks beperkt tot 999.999.999.999.
Vorig gedrag
In .NET 6 was de standaardlogica voor het parseren van numerieke notatie beperkt tot een precisie van Int32.MaxValue of minder. Het beoogde gedrag was om een FormatException op te werpen bij elke precisie die groter is dan Int32.MaxValue. Vanwege een fout heeft .NET 6 die uitzondering echter niet gegenereerd voor sommige dergelijke invoer. Het beoogde gedrag was:
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.
Daarnaast was er geen limiet voor de exponentgrootte bij het parseren van een BigInteger tekenreeks.
Nieuw gedrag
Vanaf .NET 7 ondersteunt .NET precisie tot 999.999.999.999. A FormatException wordt gegenereerd als de precisie groter is dan 999.999.999. Deze wijziging is geïmplementeerd in de parseringslogica die van invloed is op alle numerieke typen.
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.
Bovendien, als u een BigInteger met een exponent groter dan 999.999.999 uit een tekenreeks probeert te parseren, wordt er een FormatException gegenereerd.
Geïntroduceerde versie
.NET 7
Type van brekende verandering
Deze wijziging kan van invloed zijn op binaire compatibiliteit.
Reden voor wijziging
Het gedrag dat in .NET 6 is geïntroduceerd, was bedoeld om een FormatException te genereren voor elke precisie die groter is dan Int32.MaxValue. Vanwege een bug wierp het echter die uitzondering niet voor enkele invoerwaarden die groter zijn dan het maximum. Met deze wijziging wordt de fout opgelost door de precisie te beperken tot 999.999.999.
Aanbevolen actie
In de meeste gevallen is er geen actie nodig, omdat het onwaarschijnlijk is dat u al een precisie gebruikt die hoger is dan 999.999.999 in uw notatietekenreeksen.
Betreffende API's
Deze wijziging is geïmplementeerd in de parseringslogica die van invloed is op alle numerieke typen.
- 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)