0

for ループ内で割り当てる必要がある変数がいくつかあります。どうやら、ループが終了すると、C# はそこで起こったことを無視し、変数は元の状態に戻されます。具体的には、List の最後と最後から 2 番目の要素にする必要があります。コードは次のとおりです。

int temp1, temp2;
for (int i = 0; i < toReturn.Count; i++) {
     if (i == toReturn.Count - 2) { // Next-to-last element
         temp1 = toReturn[i];
     } else if (i == toReturn.Count - 1) { // Last element
         temp2 = toReturn[i];
     }
}
// At this point, temp1 and temp2 are treated as uninitialized

注: 不適切な変数名は気にしないでください。これらは実際には一時的な変数です。より複雑なものは、物事を混乱させるでしょう。

さて、これを解決するには(私が知っている)2つの方法があります.1つはループ終了後に変数を有効にする方法を考え出すこと、もう1つはtemp = my_list[-1]最後の要素を取得するためにできるPythonのようなことをすることです.リストの。これらのいずれかが C# で可能ですか?

編集:コンパイルしようとすると、「割り当てられていないローカル変数 'temp1' の使用」エラーが発生します。このコードは実行されることさえありません。呼び出されることのないメソッドの中にあるだけです。これが役立つ場合は、別のループ内で変数を使用しようとしています。

4

6 に答える 6

11

やってみませんか...

int temp1 = 0;
int temp2 = 0;
    if (toReturn.Count > 1)
        temp1 = toReturn[toReturn.Count - 2];
    if (toReturn.Count > 0)
        temp2 = toReturn[toReturn.Count - 1];
于 2009-09-29T20:55:01.953 に答える
5

toReturn.Count が 0 の場合、ループは実行されず、temp1 と temp2 は初期化されません。

于 2009-09-29T20:53:33.157 に答える
1

これは何をするのですか?

if (toReturn.Count > 1) {
    temp1 = toReturn[toReturn.Count - 2]
    temp2 = toReturn[toReturn.Count - 1]
}
于 2009-09-29T20:55:51.700 に答える
0
int temp1 = 0; // Or some other value. Perhaps -1 is appropriate.
int temp2 = 0; 

for (int i = 0; i < toReturn.Count; i++) {
     if (i == toReturn.Count - 2) { // Next-to-last element
         temp1 = toReturn[i];
     } else if (i == toReturn.Count - 1) { // Last element
         temp2 = toReturn[i];
     }
}

コンパイラーはそれを要求しtemp1、それらの値を読み取ろうとする前にtemp2確実に割り当てられます。コンパイラは、forループが変数を割り当てることを知りません。forループが実行されるかどうかはわかりません。また、if-conditionsがになるかどうかもわかりませんtrue

上記のコードは、とが何かに割り当てられていることを確認しtemp1ますtemp2ループに割り当てられているかどうかtemp1を確認したい場合は、次のことを追跡することを検討してください。temp2

int temp1 = 0;
int temp2 = 0;
bool temp1Assigned = false;
bool temp2Assigned = false;

for (int i = 0; i < toReturn.Count; i++) {
     if (i == toReturn.Count - 2) { // Next-to-last element
         temp1 = toReturn[i];
         temp1Assigned = true;
     } else if (i == toReturn.Count - 1) { // Last element
         temp2 = toReturn[i];
         temp2Assigned = true;
     }
}
于 2009-09-29T21:05:38.810 に答える
0

temp1 と temp2 に初期値、つまり 0 または適切なものを指定してみてください。初期化されない可能性があるためです。

于 2009-09-29T20:57:50.027 に答える
0

デフォルト値が必要な場合:

int count = toReturn.Count;
int temp1 = count > 1 ? toReturn[count - 2] : 0;
int temp2 = count  > 0 ? toReturn[count - 1] : 0;

デフォルト値を気にせず、以前にカウントのチェックを行っている場合:

int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];
于 2009-09-29T21:06:05.503 に答える