展开循环工作,for循环不起作用

我有一些我不明白的行为。 展开的循环正常工作! 循环抛出IndexOutOfRangeExceptions。 debugging显示有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]); }); } } 

你正在捕获你的lambdaexpression式中的variables i 。 当这个lambdaexpression式被执行时,它将使用i的“当前”值 – 它总是9.你想捕获variables的副本 …你可以在循环中引入一个新的variables:

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