始终分配变量时使用未分配的局部变量

时间:2013-01-04 00:52:17

标签: c#

下面的代码(不是生产代码)将不会编译,因为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;
     }

  }

4 个答案:

答案 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;
     ...