simpsons simpson significado reinsensibilizacion peliculas parodias nada mejores los las krusty homero bucle c# unity3d

c# - simpson - reinsensibilizacion significado



El bucle desenrollado funciona, porque el bucle no funciona (1)

Esta pregunta ya tiene una respuesta aquí:

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 < 9; ++i) { teamButtons[i].onClick.AddListener(() => { 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])); }