2017-03-07 23 views
2

私は理解できない動作があります。アンロールされたループはうまく動作しますが!!!ループはIndexOutOfRangeExceptionsをスローします。デバッグは0..9のteamButtonsと0..9のカードc [i]を示しています。 :(アンロールされたループが動作し、forループが機能しません。

private void Awake() 
{ 
    InitCards(); 
    // This works! 
    teamButtons[0].onClick.AddListener(() => SetCard(c[0])); 
    teamButtons[1].onClick.AddListener(() => SetCard(c[1])); 
    teamButtons[2].onClick.AddListener(() => SetCard(c[2])); 

    teamButtons[3].onClick.AddListener(() => SetCard(c[3])); 
    teamButtons[4].onClick.AddListener(() => SetCard(c[4])); 
    teamButtons[5].onClick.AddListener(() => SetCard(c[5])); 

    teamButtons[6].onClick.AddListener(() => SetCard(c[6])); 
    teamButtons[7].onClick.AddListener(() => SetCard(c[7])); 
    teamButtons[8].onClick.AddListener(() => SetCard(c[8])); 
    // This yields an IndexOutOfRangeException 
    for (int i = 0; i < 9; ++i) 
    { 
     teamButtons[i].onClick.AddListener(() => { SetCard(c[i]); }); 
    } 
} 
+0

:変数...あなたがループ内で新しい変数を導入することができないのコピーをキャプチャ代わりに答えを追加します。 –

+0

i ++ not ++ i、httを参照してくださいp://stackoverflow.com/questions/24853/what-is-the-difference-between-i--i – yes

答えて

12

あなたのラムダ式で変数iをキャプチャしていること、ラムダ式が実行されると、それはiの「現在」の値を使用します - 。あなたがしたい常に9になりますこれは、多くの質問が重複しているが、それは検索して見つけるのは難しい一つですので、私

for (int i = 0; i < teamButtons.Length; i++) 
{ 
    int index = i; 
    teamButtons[i].onClick.AddListener(() => SetCard(c[index])); 
} 
+0

迅速な回答ありがとうございます。それは理にかなっている。 –

+2

長さが変更されたときに 'IndexOutOfRangeExceptions'を避けるために' i <9'が 'i Programmer

+2

@Programmer:良い点、するでしょう。 –

関連する問題