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

このエラーを解決するには 2 つの方法があります。

初め

dateStartedActualcatch ブロックに何らかの値を割り当てます。

また

2番

dateStartedActualtry ブロックの前にいくつかのデフォルト値を指定します。その場合、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か、永久にループし続けるため、そのメソッドを呼び出すことによって割り当てられた変数は確実に割り当てられます。

次に、メインコードで次のように記述できます。

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 に答える