似乎这个特定的错误已经解决了很多次,但我的代码片段有一些不同,因为它永远不会导致"未分配"错误。
这段代码来自我为学校做的一个项目。我可以寻求帮助,这就是我希望在这里找到的。我不在乎掩盖任何变量或其他任何东西,因为它不是出于商业目的。
这是编译时的错误:"使用未赋值的局部变量'日期开始实际'"
switch (userType)
{
case "Doctor":
string qualification = Microsoft.VisualBasic.Interaction.InputBox("What is the highest qualification this person has", "Qualification", "", -1, -1);
while (dateStarted == "")
{
try
{
dateStarted = Microsoft.VisualBasic.Interaction.InputBox("On which date did this person start", "Date Started", "", -1, -1);
int day = Convert.ToInt32(Regex.Match(dateStarted, @"d{2}").Value);
dateStarted.Remove(0,3);
int month = Convert.ToInt32(Regex.Match(dateStarted, @"d{2}").Value);
dateStarted.Remove(0,3);
int year = Convert.ToInt32(Regex.Match(dateStarted, @"d{4}").Value);
dateStartedActual = new DateTime(day, month, year);
}
catch (Exception ex)
{
MessageBox.Show("The date entered is not valid");
dateStarted = "";
}
}
string field = Microsoft.VisualBasic.Interaction.InputBox("In which field does this person practice", "Field", "", -1, -1);
CreateDoctor(qualification, dateStartedActual, field);
break;
有两种方法可以解决此错误。
第一
在 catch 块中分配一些 dateStartedActual
值。
或
第二
在尝试阻止之前提供一些默认值dateStartedActual
。在这种情况下,如果 try 块中有任何异常,您的dateStartedActual
将具有您提供的默认值。
我的代码片段有一些不同的东西,因为它永远不会导致"未分配"错误
好吧,它显然确实会导致该错误,这就是您问这个问题的原因,不是吗?
即使你知道任何时候抛出异常,你都会再次循环,编译器不知道......因此错误。该值未明确分配。当然,你可以一开始就给它一个虚拟值——但我个人不喜欢这样做。
您最好将解析代码提取到一个单独的方法中,该方法可能如下所示:
static DateTime RequestStartDate()
{
while (true)
{
try
{
// Ask for date and parse it
// ...
return parsedDate;
}
catch (Exception e) // See below...
{
MessageBox.Show("The date entered is not valid");
}
}
}
该方法最终肯定会返回一个DateTime
,或者永远循环 - 因此通过调用该方法分配的任何变量都将被明确分配。
然后在主代码中,您可以编写:
switch (userType)
{
case "Doctor":
string qualification = Microsoft.VisualBasic.Interaction.InputBox("What is the highest qualification this person has", "Qualification", "", -1, -1);
DateTime dateStarted = RequestStartDate();
string field = Microsoft.VisualBasic.Interaction.InputBox("In which field does this person practice", "Field", "", -1, -1);
CreateDoctor(qualification, dateStarted, field);
break;
顺便说一句,你打电话给string.Remove
而忽略了结果 - 总是一个坏主意。手动解析日期是不必要的复杂 - 使用 DateTime.TryParseExact
.
此外,捕获Exception
通常是一个坏主意 - 您应该捕获特定的异常...尽管如果您使用 DateTime.TryParseExact
则不需要捕获任何内容,因为如果无法解析值,它只会返回false
。
我还建议您至少为Microsoft.VisualBasic
制定一个using
指令,以便您可以使用:
string qualification = Interaction.InputBox(...);
等等,而不是每次都排很长的队。