我有以下C#设置:
DateTime DOB;
DateTime.TryParse(dicGuarantor["DateOfBirth"].ToString(), out DOB);
....
DateOfBirth = DOB;
Run Code Online (Sandbox Code Playgroud)
我的问题与TryParse失败的情况有关.
据我所知,变量
DateTime DOB
将保持未分配状态,这意味着在此方案中,当代码到达该行时:
DateOfBirth = DOB;
Run Code Online (Sandbox Code Playgroud)
它将给出与使用未分配变量有关的错误.
但是,在我的代码中似乎没有发生这种情况,不会发生错误,并且页面会按预期显示.
我担心这里确实存在错误,我没有看到它,并且由于它而导致代码将进一步破坏.
任何人都可以澄清 - 似乎没有太多的在线回答这个问题.
作为一个说明,我试过:
DateTime DOB = null;
Run Code Online (Sandbox Code Playgroud)
在声明中,但这说:
'无法将null转换为'System.DateTime',因为它是一个非空的值类型'
编辑:
鉴于下面的答案,我将首先将变量的声明添加DateOfBirth到问题中:
public DateTime? DateOfBirth { get; set; }
Run Code Online (Sandbox Code Playgroud)
这意味着这是一个 nullable DateTime Obeject
现在,假设TryParse失败,它将分配的变量:
DOB = DateTime.MinValue;
因此:
DateOfBirth = DateTime.MinValue;
Run Code Online (Sandbox Code Playgroud)
现在代码中的其他地方,
我有以下内容:
if (DateOfBirth.HasValue)
...
Run Code Online (Sandbox Code Playgroud)
从运行代码开始,DateOfBirth在分配值时,这似乎会返回falseDateTime.MinValue
这是预期的吗?
out参数必须由方法分配,无论它返回什么,所以在返回之前TryParse会分配一些东西.引用C#规范:valuefalse
在方法中,就像局部变量一样,输出参数最初被认为是未分配的,必须在使用其值之前明确赋值.
在方法返回之前,必须明确赋值方法的每个输出参数.
如果您查看源代码,它将DateTime.MinValue在执行任何其他操作之前分配给它:
internal static bool TryParse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles, out DateTime result) {
result = DateTime.MinValue;
DateTimeResult resultData = new DateTimeResult(); // The buffer to store the parsing result.
resultData.Init();
if (TryParse(s, dtfi, styles, ref resultData)) {
result = resultData.parsedDate;
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)