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)
不,编译器根本没有破坏.
编译器并不能说明这一点
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明确分配.