DateOnly和TimeOnlyTryParse以及TryParseExact方法現在會在提供無效ArgumentException值或格式指定符時拋出DateTimeStyles。 這使得他們的行為與 .NET 中的其他 TryParse API 保持一致。
所推出的版本
.NET 11 預覽版 2
以前的行為
過去,將無效 DateTimeStyles 值或格式化指定符傳給 DateOnly.TryParse、 DateOnly.TryParseExact、 TimeOnly.TryParse, TimeOnly.TryParseExact 會使方法返回 false 且未拋出例外。
using System;
using System.Globalization;
bool result = DateOnly.TryParseExact(
"2023-10-15",
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
(DateTimeStyles)999, // Invalid DateTimeStyles value
out DateOnly date);
Console.WriteLine(result); // Output: False
新行為
從 .NET 11 開始,將無效 DateTimeStyles 值或格式指定符傳給這些方法會拋出一個 ArgumentException。 例外包括關於無效參數的細節,例如參數名稱。
using System;
using System.Globalization;
try
{
bool result = DateOnly.TryParseExact(
"2023-10-15",
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
(DateTimeStyles)999, // Invalid DateTimeStyles value
out DateOnly date);
}
catch (ArgumentException ex)
{
Console.WriteLine(ex.Message);
// Output: "The value '999' is not valid for DateTimeStyles. (Parameter 'style')"
}
破壞性變更的類型
此變更為行為變更。
變更原因
此變更使 DateOnly 和 TimeOnly 的解析方法行為與 .NET 中其他 TryParse API 保持一致,後者在遇到無效參數時會拋出例外。 先前對無效參數默默地回傳false的行為,可能掩蓋程式錯誤,並使除錯更困難。
建議的動作
檢視你對 DateOnly.TryParse、 DateOnly.TryParseExact、 TimeOnly.TryParse的 TimeOnly.TryParseExact 使用情況,以確保傳遞的值 DateTimeStyles 與格式指定符有效。 如果程式碼路徑中可能有無效參數,請將呼叫包裝成try-catch區塊來處理 。ArgumentException
using System;
using System.Globalization;
try
{
bool result = DateOnly.TryParseExact(
"2023-10-15",
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
(DateTimeStyles)999, // Invalid DateTimeStyles value
out DateOnly date);
}
catch (ArgumentException ex)
{
Console.WriteLine($"Error: {ex.Message}");
// Handle the exception as needed
}
受影響的 API
- System.DateOnly.TryParse(String, DateOnly)
- System.DateOnly.TryParse(String, IFormatProvider, DateTimeStyles, DateOnly)
- System.DateOnly.TryParseExact(String, String, IFormatProvider, DateTimeStyles, DateOnly)
- System.DateOnly.TryParseExact(String, String[], IFormatProvider, DateTimeStyles, DateOnly)
- System.TimeOnly.TryParse(String, TimeOnly)
- System.TimeOnly.TryParse(String, IFormatProvider, DateTimeStyles, TimeOnly)
- System.TimeOnly.TryParseExact(String, String, IFormatProvider, DateTimeStyles, TimeOnly)
- System.TimeOnly.TryParseExact(String, String[], IFormatProvider, DateTimeStyles, TimeOnly)