我刚刚在 VS2015 .Net v4.5.2 控制台应用程序中输入了以下代码:
dynamic fromString = "blah", toString = "blah2";
DateTime fromDate, toDate;
if (DateTime.TryParse(fromString.ToString(), out fromDate) && DateTime.TryParse(toString.ToString(), out toDate)) {
Console.WriteLine(fromDate);
Console.WriteLine(toDate);
}
有点出乎意料的是,我收到错误“使用未分配的局部变量 toDate”。我没想到会出现这种情况,因为仅当从第二个 TryParse 为“toDate”分配了值时才会输入 if 语句。
不用说,可以通过为“toDate”分配一个值来解决这个问题:
DateTime fromDate, toDate = DateTime.MinValue;
或者将 && 更改为 &,以便无论第一个失败如何,都会执行两个 TryParses。
不过我想知道为什么会出现这个错误?如果变量 fromString 和 toString 是字符串,则不会发生该错误,并且编译器不会给出 toDate 未分配的错误。因此我想知道为什么编译器会这样对待string
and dynamic.ToString()
不同吗?
这是因为您使用了短路运算符 &&,这意味着如果第一个 TryParse 返回 false,则第二个 TryParse 永远不会执行,从而使 ToDate 变量处于未分配状态。
尝试一下,将 && 替换为 &,错误就会消失,因为现在将始终执行两个 TryParse 调用。
编译器只是不够聪明(它不会分析你的逻辑),无法知道其中的代码在某些情况下不会被执行。
编辑:@Simon,我重新阅读了你的问题,发现你已经知道了这一点......也许是因为 .ToString 总是存在于一个对象上,但并不总是存在于动态上(例如,当它是一个 com 对象时),并且在这种情况下编译器会做更少的检查吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)