Поделиться через


Методы DateOnly и TimeOnly TryParse вызывают исключение при ошибочных входных данных

DateOnly и TimeOnlyTryParse методы теперь вызывают TryParseExact, если предоставлены недопустимые значения DateTimeStyles или спецификаторы формата. Это соответствует их поведению с другими TryParse API в .NET.

Представленная версия

.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 согласованным с другими API TryParse в .NET, позволяющими выбрасывать исключения при недопустимых аргументах. Предыдущее поведение по тихому возврату 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