似乎这个特殊错误已经解决了很多次,但我的代码片段有一些不同之处,因为它永远不会导致“未分配”的错误。
此代码来自我正在为学校所做的项目。我被允许寻求帮助,这是我希望在这里找到的。我并不关心掩盖任何变量或任何变量,因为它不是出于商业目的。
这是编译时的错误: “使用未分配的局部变量'dateStartedActual'”
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;
答案 0 :(得分:2)
有两种方法可以解决此错误。
<强>第一强>
在catch块中指定dateStartedActual
的一些值。
OR
<强>第二强>
在try block之前提供一些默认值dateStartedActual
。在这种情况下,如果try块中存在任何异常,则dateStartedActual
将具有您提供的默认值。
答案 1 :(得分:1)
我的代码段有一些不同之处,因为它永远不会导致“未分配”错误
很明显,确实导致了这个错误,这就是你问这个问题的原因,不是吗?
即使你知道任何时候抛出异常,你都会再次绕过循环,编译器不知道......因此错误。值不明确分配。当然,你可以先给它一个虚拟值 - 但我个人不喜欢这样做。
最好将解析代码解压缩到一个单独的方法中,它看起来像:
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
。
我还建议您至少对using
有一个Microsoft.VisualBasic
指令,以便您可以使用:
string qualification = Interaction.InputBox(...);
等,而不是每次都有一个很长的线。