我必须将字符串转换/解析为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
而不是原始值?
答案 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,为空字符串,或不包含 与格式中指定的模式相对应的日期和时间。
此参数未初始化传递。