2017-03-07 102 views
2

我有一些行爲,我不明白。展開的循環正常工作!循環拋出IndexOutOfRangeExceptions。調試顯示有0..9個teamButton和0..9個卡片c [i]。 :(展開的循環工作,爲循環不起作用

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

這是很多問題的重複,但它是一個很難通過搜索找到,所以我'll ll add a answer instead。 –

+0

i ++ not ++ i,see htt p://stackoverflow.com/questions/24853/what-is-the-difference-between-i-andi-i – yes

回答

12

你捕捉變量i在你的Lambda表達式當執行一個lambda表達式,它將使用的i「當前」值 - 這將永遠是9.你想捕捉變量...你可以做被引入循環中一個新的變量的副本

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

謝謝你的快速答案。這就說得通了。 –

+2

如果'i <9'是'i Programmer

+2

@程序員:好點,會做。 –