使用未初始化的变量 - 编译器坏了

fea*_*net 2 .net c# compiler-construction parsing

很明显,标题在脸颊上有点舌头,但我检查并仔细检查,我无法在逻辑中看到错误.

编译器抱怨变量parsed可能未在return语句中初始化.我不同意.我们哪个人错了,为什么?

public DateTime? Test(string nextDate)
{
    DateTime parsed;

    if (nextDate != "TBC" && !DateTime.TryParse(nextDate, out parsed))
    {
        throw new Exception();
    }

    if (nextDate == "TBC")
        return null;

    return parsed;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

不,编译器根本没有破坏.

编译器并不能说明这一点

if (nextDate != "TBC")
Run Code Online (Sandbox Code Playgroud)

if (nextDate == "TBC")
Run Code Online (Sandbox Code Playgroud)

相互排斥.它不会尝试在这两个条件之间建立任何联系.所以它无法分辨你是否肯定会打电话给DateTime.TryParse(nextDate, out parsed)return parsed;.

基本上,编译器遵循相对简单的规则来确定明确的赋值(和可达性).简单的规则易于推理,易于实现,易于编码.

幸运的是,您可以使代码更简单使其同时编译:

public DateTime? Test(string nextDate)
{
    if (nextDate == "TBC")
    {
        return null;
    }

    DateTime parsed;    
    if (!DateTime.TryParse(nextDate, out parsed))
    {
        throw new Exception();
    }
    return parsed;
}
Run Code Online (Sandbox Code Playgroud)

现在我们在开始就在一个地方处理"TBD"的"特殊情况" - 然后我们可以忽略其余代码的特殊情况并TryParse无条件地调用,留下parsed明确分配.