1

似乎这个特定的错误已经解决了很多次,但我的代码片段有一些不同之处在于它永远不会导致“未分配”错误。

这段代码来自我为学校做的一个项目。我被允许寻求帮助,这是我希望在这里找到的。我不在乎掩盖任何变量或其他任何东西,因为它不是出于商业目的。

这是编译时的错误:“使用未分配的局部变量'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;
4

2 回答 2

2

有两种方法可以解决此错误。

第一的

dateStartedActual在 catch 块中分配一些值。

或者

第二

dateStartedActual在 try 块之前提供一些默认值。在这种情况下,如果 try 块中有任何异常,您dateStartedActual将拥有您提供的默认值。

于 2013-11-02T08:32:41.477 回答
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最终返回 a ,或者永远循环下去 - 因此通过调用该方法分配的任何变量都将被确定分配。

然后在您的主代码中,您可以编写:

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(...);

等等,而不是每次排长队。

于 2013-11-02T08:30:49.307 回答