DateTime解析意外行为

时间:2018-02-14 11:57:28

标签: c# datetime

我必须将字符串转换/解析为DateTime

DateTime resultDate = new DateTime(2000,01,01);
string input = "24.24.2000";

string format = "dd.MM.yyyy";
bool success = DateTime.TryParseExact(input, format, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out resultDate);

现在,如果字符串无效且转换失败(在此示例中24不是有效月份),则方法TryParseExact会将变量resultDate更改为DateTime.Min。< / p>

如果转换失败,为什么我想要DateTime.Min而不是原始值?

2 个答案:

答案 0 :(得分:2)

  

如果转换失败,我为什么要使用DateTime.Min而不是原始值

因为这就是documentation州将要发生的事情。

  

当此方法返回时,包含等效于s中包含的日期和时间的DateTime值,如果转换成功,则转换失败时或MinValue

通过对代码的简单修改,您可以利用结果而不必重复默认值。

DateTime resultDate;
string input = "24.24.2000";
string format = "dd.MM.yyyy";

if(!DateTime.TryParseExact(input, format, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out resultDate))
    resultDate = new DateTime(2000,01,01);

答案 1 :(得分:2)

这实际上与DateTime.TryParseExact无关,也不是意外行为。结果是out参数,这意味着方法将始终为其分配值。该语言实际上需要out关键字以避免任何混淆。 out参数应为空,这就是为什么你可以在不指定值的情况下声明它们的原因。

方法的代码甚至无法尝试读取 out参数而不将其初始化为某些内容。以下示例将无法使用Use of unassigned out parameter 'result'进行编译:

bool TryParse(string text,out DateTime result)
{
    var original=result;    //this fails compilation
    result=DateTime.Today;
    return true;
}

除非方法抛出异常,否则out参数始终分配方法。

DateTime.TryParseExact的文档说明了转换失败时的默认值。它还解释了该参数应该未经初始化传递

  

当此方法返回时,包含等效于的DateTime值   s中包含的日期和时间,如果转换成功,或者   如果转换失败,则为MinValue。如果要么转换失败   s或format参数为null,为空字符串,或不包含   与格式中指定的模式相对应的日期和时间。

     

此参数未初始化传递。