c# - simpson - reinsensibilizacion significado
El bucle desenrollado funciona, porque el bucle no funciona (1)
Esta pregunta ya tiene una respuesta aquí:
- La variable capturada en un bucle en C # 6 responde
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]));
}