1

我在 try...catch 之前声明了一个变量,并在 try 块中分配了它。我不断收到“fileDate”的未分配变量错误。

class Something
{
    string fACR = "BAK";
    int numbDays = 5;

    Public static void Main()
    {
        DateTime fileDate;
        try
        {
            fACR = args[0];
            numbDays = int.Parse(args[2]);
            fileDate = DateTime.Parse(args[1]);
        }
        catch (ArgumentException e)
        {
            Console.WriteLine("INVALID COMMAND LINE ARGUMENTS! Follow Format:");
            Console.WriteLine("<farm_acronym> <yyyy-M-d> <# days>");
            Console.WriteLine(e);
        }

        inFileName = "U:/CANSO/Engineering/Farms/" + fACR +
            "/DailyDownloads/";
        switch (fACR)
        {
            case "DEM":
                inFileName = inFileName + "Report_Recombiner_" + fileDate.ToString("yyyy-MM-dd") + 
                    ".csv";
                break;
            default:
                inFileName = inFileName + "REPORT_Recombiner_" + fileDate.ToString("yyyy-M-d") + 
                    ".csv";
                break;
        }
    }
}

我在声明时尝试使用它:

DateTime fileDate = null;

这也不起作用(DateTime 不可为空)。有什么建议么?

4

3 回答 3

1

更新:如果在将错误记录到控制台后您需要停止执行,那么您可以重新抛出异常。但是代码仍然需要更多改进。

其他人解释了错误背后的原因。但我建议你重构你的代码,把 try/catch 拿出来写成一个方法。但是下面的代码仍然不好。我不喜欢这种方式fACR并且numbDays被定义。

class Something
{
    string fACR = "BAK";
    int numbDays = 5;

    Public static void Main()
    {
        DateTime fileDate = GetFileDate(args);


        inFileName = "U:/CANSO/Engineering/Farms/" + fACR +
            "/DailyDownloads/";
        switch (fACR)
        {
            case "DEM":
                inFileName = inFileName + "Report_Recombiner_" + fileDate.ToString("yyyy-MM-dd") + 
                    ".csv";
                break;
            default:
                inFileName = inFileName + "REPORT_Recombiner_" + fileDate.ToString("yyyy-M-d") + 
                    ".csv";
                break;
        }
    }
    public static DateTime GetFileDate(string[] args)
    {
        try
        {
            fACR = args[0];
            numbDays = int.Parse(args[2]);
            return DateTime.Parse(args[1]);
        }
        catch (Exception e)
        {
            Console.WriteLine("INVALID COMMAND LINE ARGUMENTS! Follow Format:");
            Console.WriteLine("<farm_acronym> <yyyy-M-d> <# days>");
            Console.WriteLine(e);
            throw;
        }
    }


}
于 2014-02-04T20:15:29.283 回答
0

你必须给它分配一些价值。如您所述,DateTime它不是引用类型,因此它不能为空。因此,只需为其分配一些您知道无效的默认值 - 例如DateTime.MinValue. 您可以稍后检查该值是否已分配。

当然,如果对您DateTime.MinValue来说是一个有效值,就像所有其他值一样,您应该使用更可靠的方法来检查是否进行了赋值 - 例如,使用 nullable DateTime?。一般来说,.NET 不赞成使用特殊值来标记无效数据——这正是 Nullable 类型的用途。

于 2014-02-04T19:28:57.360 回答
0

您可以使用可为空的 DateTime,“DateTime?” (这意味着,明确地,“也允许空值的 DateTime”),或者在这种情况下可能更容易,只需在创建 DateTime 时为其分配一个标志值,例如DateTime fileDate = DateTime.MinValue

当然,在这种情况下,您似乎只想返回 catch 并将 fileDate 放在 try 范围内 - 如果 fileDate 变量没有正确初始化,那么在 try/catch 之外的范围内有什么好处?

于 2014-02-04T19:30:29.997 回答