下面的代码(不是生产代码)将不会编译,因为Use of unassigned local variable 'dateTime'
看着它我可以告诉该变量永远不会在返回时被取消分配。在Any子句中返回out参数是不好的形式,但为什么不能编译?
private static DateTime? ConvertStringToDateByFormat(string date) {
DateTime dateTime;
var acceptableDateFormats = new List<String>{
"d/MM/yyyy",
"d/M/yyyy",
"d/MM/yy",
"d/M/yy",
"d-MM-yyyy",
"d-M-yyyy",
"d-MM-yy",
"d-M-yy",
"d.MM.yyyy",
"d.M.yyyy",
"d.MM.yy",
"d.M.yy",
"d-MMM-yyyy",
"d-MMM-yy",
"d MMM yyyy",
"d MMM yy"
};
if (acceptableDateFormats.Any(format => DateTime.TryParseExact(date, format, CultureInfo.CurrentCulture, DateTimeStyles.None, out dateTime))) {
return dateTime;
}
else {
return null;
}
}
答案 0 :(得分:2)
因为传递给Any
的lambda可能无法执行 - 假设您的acceptableDateFormats是一个空集合。编译器可能更智能,并且看到它之前已经定义并且它有一些值,但是像编译器可以那样做的许多其他事情,它可能不值得编译器开发人员的努力实现这样的事情。
答案 1 :(得分:1)
添加到@ carlosfigueira的答案:此外,编译器在编译时永远不会知道您的date
变量是否可以成功解析并将其存储在dateTime
变量中。因此,当程序到达dateTime
语句时,您的return dateTime
变量可能无法初始化。
答案 2 :(得分:0)
这是因为.Net编译器正在检查代码的语法。正如您已经指出的那样,dateTime对象不是实例化的,这会导致语法无效&#34;。
答案 3 :(得分:0)
您可以为它分配一个值,因为如果它仍无法解析,则返回null
private static DateTime? ConvertStringToDateByFormat(string date)
{
DateTime dateTime = DateTime.MinValue;
...