我有以下C#设置:
DateTime DOB;
DateTime.TryParse(dicGuarantor["DateOfBirth"].ToString(), out DOB);
....
DateOfBirth = DOB;
我的问题与TryParse
失败的情况有关。
据我了解,变量
DateTime DOB
将保持未分配状态,这意味着在此方案中,当代码到达行时:
DateOfBirth = DOB;
它将给出与使用未分配变量有关的错误。
但是,在我的代码中似乎没有发生这种情况,不会发生错误,并且页面会按预期显示。
我担心这里确实存在错误,而且我没有看到它,并且代码会因此而破坏。
任何人都可以澄清 - 网上似乎没有多少人回答这个问题。
作为一个说明,我试过了:
DateTime DOB = null;
关于声明,但是这说:
'无法将null转换为'System.DateTime',因为它是一个 非nullavle值类型'
编辑:
鉴于以下答案,我将首先将变量DateOfBirth
的声明添加到问题中:
public DateTime? DateOfBirth { get; set; }
这意味着这是nullable DateTime Obeject
现在,假设TryParse
失败,它将分配的变量:
DOB = DateTime.MinValue;
因此:
DateOfBirth = DateTime.MinValue;
现在代码中的其他地方,
我有以下内容:
if (DateOfBirth.HasValue)
...
从运行代码开始,当DateOfBirth
被赋值DateTime.MinValue
这是预期的吗?
答案 0 :(得分:7)
out
参数必须按方法分配,无论它返回什么,因此TryParse
会在返回value
之前将内容分配给false
。引用C#规范:
在方法中,就像局部变量一样,输出参数最初被视为未分配,必须在使用其值之前明确赋值。
方法的每个输出参数必须在方法返回之前明确赋值。
如果您查看source,则会在执行任何其他操作之前将其分配给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;
}
答案 1 :(得分:2)
不,当您使用“out”参数调用方法时,该方法必须为其添加一个vaule:
虽然作为out参数传递的变量不一定是 在传递之前初始化,需要调用方法 在方法返回之前分配一个值。
你甚至无法编译:
public void Foo(out DateTime value)
{
}
CS0177 out参数'value'必须在控制之前分配 离开了当前的方法
答案 2 :(得分:2)
请docs of this method。它说当TryParse失败时,它会将DateTime.MinValue
分配给你的out变量,因此在调用TryParse
方法后你不能指望它被取消分配。它将包含一些价值。 if值是否有效取决于TryParse
的返回结果。如果它返回true,则out
参数将具有转换日期,否则它将具有DateTime.MinValue
作为其值。
答案 3 :(得分:0)
也许试试这个:
if(!DateTime.TryParse(dicGuarantor["DateOfBirth"].ToString(), out DOB))
{
DOB = new DateTime()
}
如果在尝试解析时失败,则使新的DateTime对象为空
或使用DateTime作为可空DataTime?