问题
for (int i = 0; i < delegateManager.chooseTexts.Count; i++)
{
GameObject choose=Instantiate(choosenPrefab,choosenSet.transform);
choose.transform.GetChild(0).GetComponent<Text>()
.text=delegateManager.chooseTexts[i];
Debug.Log(delegateManager.chooseMethods[i]);
choose.GetComponent<Button>().onClick.AddListener(
()=>delegateManager.chooseMethods[i]()
);
choose.transform.localScale=new Vector3(1,1,1);//防止缩放
}
上图是我在用委托写动态绑定按钮事件。
然而出现了下标越界的错误。
我直接调用了该委托方法,发现delegateManager.chooseMethods[i]();本身并没有错误,如下图
for (int i = 0; i < delegateManager.chooseTexts.Count; i++)
{
GameObject choose=Instantiate(choosenPrefab,choosenSet.transform);
choose.transform.GetChild(0).GetComponent<Text>()
.text=delegateManager.chooseTexts[i];
Debug.Log(delegateManager.chooseMethods[i]);
delegateManager.chooseMethods[i]();//正确执行
choose.GetComponent<Button>().onClick.AddListener(
()=>delegateManager.chooseMethods[i]()
);
choose.transform.localScale=new Vector3(1,1,1);//防止缩放
}
查阅资料后发现lambda表达式用在循环中时,其中的循坏变量,也就是我这里的i一直是循环结束后的i
for(int i=0;i<5;i++)
{
lambda(()=>Debug.Log(i))//i的值一直为5
}
解决方法
使用一个局部变量来存储i的值
for(int i=0;i<5;i++)
{
int currentIndex=i;
lambda(()=>Debug.Log(current))//current为 0 1 2 3 4
}
注意事项
要注意的是 lambda中无法修改外部变量的值
因为对于局部变量而言,它的生命周期就是所在方法的生命周期。这就决定了count无法被位于同一个栈帧上的lambda修改,因为这种修改毫无意义,你无法将你的修改传递出当前栈帧。