0

なぜコンパイラがこのエラーを出すのか疑問に思っています。tryブロックは、関数が呼び出されるたびに実行されます。つまり、変数が割り当てられます。しかし、それでもコンパイルできません。

using System;

namespace Checking
{
    class Program
    {
        static void Main(string[] args)
        {
            int intNum;
            intNum = readValue("Please enter a number: ");

        }
        static int readValue(string strPrompt)
        {
            int intRes;
            Console.WriteLine(strPrompt);
            try
            {
                intRes = Convert.ToInt32(Console.ReadLine());   // Gets assigned here! But still doesnt allow me to compile!

            }
            catch (Exception ex)
            {
                Console.WriteLine("Please enter a numeric value.\n");
                readValue(strPrompt);
            }
            return intRes;    
        }
    }
}

return intResをtryブロック内に配置すると、そのエラーを取り除くことができますが、すべてのコードパスが値を返すわけではないというエラーが発生します。エラーは理解できますが、コンパイルできない理由がわかりません。tryブロックが毎回実行されます。

また、intResに0を割り当てると、そのエラーが解消されることも知っています。

よろしく、

4

5 に答える 5

3

試行が失敗した場合、intResには値がないため

あなたのキャッチ使用で

intRes = readValue(strPrompt);

で初期化する

int intRes = 0;

それ以外の

int intRes;

int.TryParse構文も確認することをお勧めします

于 2012-09-03T12:16:17.980 に答える
3

Convert.ToInt32失敗した場合、intResに割り当てられることはありません。

変数を作成するときにデフォルト値を設定するか、catchブロックでに割り当てます。

于 2012-09-03T12:16:19.027 に答える
3

コンパイラは正しいです。変数は常に割り当てられるとは限りません。

変換が失敗した場合、割り当ては発生せず、catchブロック内で実行が続行されます。ここで関数を再度呼び出しますが、その呼び出しの戻り値を変数に割り当てるのを忘れています。

catch (Exception ex)
{
  Console.WriteLine("Please enter a numeric value.\n");
  intRes = readValue(strPrompt);
}

whileこれは、とを使用した代替実装TryParseです。

static int readValue(string strPrompt) {
  int intRes = 0;
  bool done = false;
  while (!done) {
    Console.WriteLine(strPrompt);
    if (Int32.TryParse(Console.ReadLine(), out intRes) {
      done = true;
    } else {
      Console.WriteLine("Please enter a numeric value.\n");
    }
  }
  return intRes;    
}
于 2012-09-03T12:18:39.853 に答える
2

例外をスローすると、初期化されていないintRes状態になります。Console.ReadLine()それがあなたのコンパイラが文句を言う理由です。

于 2012-09-03T12:18:59.133 に答える
1

コンパイラには、tryブロック内のコードが例外をスローするかどうかを知る方法がありません。
したがって、コードが例外をスローした場合、intRes変数が割り当てられることはありません。

その結果、コンパイラはエラーメッセージを出力します。

また、現状では、コードに問題があります。正しい値を取得するためにcatchブロック内でreadValueを再帰的に呼び出そうとしますが、ユーザーが最終的に正しい値を入力すると、結果値にローカル変数を使用しているため、mainは入力された値を受け取りません。

于 2012-09-03T12:17:20.203 に答える