El bucle desenrollado funciona, porque el bucle no funciona

Tengo un comportamiento que no entiendo. ¡Mientras que el bucle desenrollado funciona bien! El ciclo arroja IndexOutOfRangeExceptions. La depuración muestra que hay 0..9 TeamButtons y 0..9 cards 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  { SetCard(c[i]); }); } } 

Estás capturando la variable i en tu expresión lambda. Cuando se ejecuta esa expresión lambda, usará el valor “actual” de i , que siempre será 9. Desea capturar una copia de la variable … lo cual puede hacer introduciendo una nueva variable en el ciclo:

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