我在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不可为空)。有什么建议吗?
答案 0 :(得分: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;
}
}
}
答案 1 :(得分:0)
您必须为其指定一些值。如您所述,DateTime
不是引用类型,因此它不能为null。因此,只需为其分配一些您知道无效的默认值 - 例如DateTime.MinValue
。您可以稍后检查该值是否已分配。
当然,如果DateTime.MinValue
是有效的值,就像所有其他值一样,您应该使用更强大的方法来检查是否已进行分配 - 例如,通过使用可空的DateTime?
。一般来说,.NET不赞成使用特殊值来标记无效数据 - 这正是Nullable类型的用途。
答案 2 :(得分:0)
你可以使用可以为空的DateTime,“DateTime?” (这明确地表示“也允许空值的DateTime”),或者在这种情况下可能更容易,只需在创建日期时为其分配标志值,如DateTime fileDate = DateTime.MinValue
当然,在这种情况下,似乎你只想在catch中返回并将fileDate放在try范围内 - 如果不是try / catch之外的范围内有fileDate变量有什么用呢?无论如何都要正确初始化?