8

私はプログラミングが初めてで、次のコードに問題があります。

    private string alphaCoords(Int32 x)
    {
        char alphaChar;

        switch (x)
        {
            case 0: alphaChar = 'A'; break;
            case 1: alphaChar = 'B'; break;
            case 2: alphaChar = 'C'; break;
            case 3: alphaChar = 'D'; break;
            case 4: alphaChar = 'E'; break;
            case 5: alphaChar = 'F'; break;
            case 6: alphaChar = 'G'; break;
            case 7: alphaChar = 'H'; break;
            case 8: alphaChar = 'I'; break;
            case 9: alphaChar = 'J'; break;
        }

        return alphaChar.ToString();
    }

コンパイラは言う: 割り当てられていないローカル変数 'alphaChar' の使用

しかし、私はそれを自分の switch ブロックに割り当てています。

私はプログラミングについて十分に知らないので、これは私のせいだと確信しています。

お知らせ下さい。

ありがとう。

4

8 に答える 8

35

x が 0 ~ 9 の場合、割り当てています。xしかし、123 だったらどうすると思いますか? 0 から 9 までの値のみが渡されることはわかっているかもしれませんが、コンパイラはそうありません。

これを回避する 1 つの方法はdefault、switch ステートメントに case を含めることです。これを使用して、値が期待される範囲内にない場合に例外をスローできます。

switch (x)
{
    case 0: alphaChar = 'A'; break;
    case 1: alphaChar = 'B'; break;
    case 2: alphaChar = 'C'; break;
    case 3: alphaChar = 'D'; break;
    case 4: alphaChar = 'E'; break;
    case 5: alphaChar = 'F'; break;
    case 6: alphaChar = 'G'; break;
    case 7: alphaChar = 'H'; break;
    case 8: alphaChar = 'I'; break;
    case 9: alphaChar = 'J'; break;
    default: throw new ArgumentOutOfRangeException();
}

ただし、switchステートメントを完全に削除する、少し単純な代替手段を次に示します。

if (x < 0 || x > 9)
{
    throw new ArgumentOutOfRangeException();
}
char alphaChar = (char)('A' + x);

このような算術演算を使用する場合は注意が必要です。Java と C# では、基になる表現が Unicode であることが保証されているため、作業がずっと簡単になります。このようなこと(および16進の解析/フォーマット)には問題ないと思いますが、よりエキゾチックなシナリオに挑戦すると失敗します。繰り返しになりますが、これは多くのコード単純化手法に当てはまります...それらが不適切に適用されると、混乱してしまいます。

于 2009-12-27T16:31:27.207 に答える
2

switch ステートメントにデフォルトを追加する必要があります。

コンパイラは、変数に値を割り当てない場合があると述べています。だから追加

default:
  alphaChar = 'x'
break;

コンパイラに「シナリオを見逃した場合に備えて、値をこれにします」と伝えます

または、デフォルトを割り当てたくない場合:

  default: throw new Exception();

これは必ずしも優れているとは限りませんが、別の方法があります。

 private string alphaCoords(Int32 x)
    {
      if(x >= 0 && x =< 9)
           return ((char)(x + 65)).ToString();
      else
        throw new ArgumentException();
    }
于 2009-12-27T16:31:36.117 に答える
2

alphaChar が未定義の可能性があるため、コンパイラは不平を言っています。それがあなたの値の1つではない場合、それはswitch定義されていません。次のいずれかを実行できます。

  • どのスイッチ条件も真でない場合に引き継がれる char の初期値を設定します。
  • switch ステートメントに「default」句を追加します。
于 2009-12-27T16:32:08.283 に答える
2

最初に使用する前に、ローカル変数を確実に割り当てる必要があります (C# 仕様規則に従って)。この特定のケースでは、switch コンストラクトは alphaChar が確実に割り当てられることを保証しないため、コンパイラ エラーが発生します。alphaChar に初期値を指定できるため、確実に割り当てられます。

于 2009-12-27T16:33:24.100 に答える
1

alphaCharいくつかの条件に基づいて変数に値を割り当てています。x変数に 0 から 9 以外の値が含まれているシナリオを想像してください。変数に 10 が含まれているとします。この場合、 によってどのケース条件も満たされないxため、alphaCharには値が割り当てられず、結果として完全に初期化されません。したがって、文字列に変換するときはalphaChar、ガベージ値を文字列に変換し、呼び出し元のメソッドに返します。これが、そのメッセージを受け取る理由です。

簡単な解決策が必要な場合は、以下のコードを追加してください

case 9: alphaChar = 'J'; 
        break; 

-

default: return null;

alphaCoords次のように、この関数が null を返すかどうかを呼び出し元のメソッドで確認します。

if(alphaCooord(10) == null)
{
    // x contains value other than 0 to 9
}
else
{
    // x contains value between 0 to 9, so the returned value will be the string
    // representation of the corresponding character
}

このようにして、コードが複雑になりすぎたり、例外などをスローしたり処理したりする必要がなくなります。

それが役立つことを願っています:)。

于 2010-01-09T16:57:48.743 に答える
0

コンパイラーは、変数xに 9 までの数字しか含めることができないことを知る方法がありません (これは、 でチェックするものです switch)。defaultケースがスイッチにないため、未割り当てのままになる可能性がalphaCharあります。ケースを追加するかdefault、変数の前に値を割り当てることができますswitch

于 2009-12-27T16:31:50.767 に答える
0

x が 10 の場合、alphaChar が割り当てられないため、スイッチにデフォルトを追加します。

于 2009-12-27T16:31:53.883 に答える
0

変数 char alphaChar を宣言した後、switch ステートメントで値を取得することを期待していても、変数に値を「割り当てる」(何かと等しくなるように設定する) 必要があります。

「A」または「0」またはほとんど何でも割り当てることができます。

このような宣言でそれを行うことができます

char alphaChar = 'A';

または、個別に行うこともできます

char alphaChar;    
alphaChar = 'A';
于 2009-12-27T16:32:56.330 に答える