2017-03-07 106 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

@程序员:好点,会做。 –