C#使用未分配的变量

时间:2015-11-27 08:07:04

标签: c#

我有以下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

时,这似乎会返回false

这是预期的吗?

4 个答案:

答案 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参数传递的变量不一定是   在传递之前初始化,需要调用方法   在方法返回之前分配一个值。

Source

你甚至无法编译:

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?