for (int i = 0; i < ShowBtnList.Count; i++)
{
ShowBtnList[i].onClick.AddListener(() =>
{
for (int j = 0; j < allList[i].Count; j++)
{
Debug.Log(1);
}
});
}
上面这样一段函数,看起来没有什么大的问题,实际执行的时候会发生越界的问题,这是因为匿名函数的闭包问题
闭包是指匿名函数可以捕获并访问其所在作用域的变量,即使该函数在作用域之外执行。匿名函数在内部“记住”了这些变量的引用,而不仅仅是它们的值。
因此,点击任意按钮时,i
总是等于 ShowBtnList.Count
,导致访问 allList
的索引超出范围。
解决方案如下,可以添加一个中间变量index
for (int i = 0; i < ShowBtnList.Count; i++)
{
int index = i; // 创建一个局部变量来存储当前的 i 值
ShowBtnList[index].onClick.AddListener(() =>
{
for (int j = 0; j < allList[index].Count; j++)
{
Debug.Log(1);
//allList[index][j].SetActive(true);
}
});
}