C#使用未分配的变量

Ale*_*lex 0 c#

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

这是预期的吗?

Mar*_*zek 7

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)