ArgumentOutOfRangeException:Argument超出范围



我有以下列表:

public Question init()
{
questions = new List<GameManager.Question>();
questions.Add(new GameManager.Question("Ya no hay técnicas que te puedan salvar.", "Sí que las hay, sólo que nunca las has aprendido."));
questions.Add(new GameManager.Question("Espero que tengas un barco para una rápida huida.", "¿Por qué? ¿Acaso querías pedir uno prestado?"));
questions.Add(new GameManager.Question("Ahora entiendo lo que significan basura y estupidez.", "Me alegra que asistieras a tu reunión familiar diaria."));
return questions;
}

我在启动时初始化以下按钮:

for (int i = 0; i < questionList.Count; i++)
{
GameObject child = Instantiate(questionButton, buttonLayout.transform);
child.GetComponent<Text>().text = questionList[i].answer;
child.GetComponent<Button>().onClick.AddListener(() => QuestionCheck(i));
}

我有以下代码:

public void QuestionCheck(int index)
{
if (currentQuestion.answer == questionList[index].answer)
{
playerAsk = 1;
playerScore += 1;
scorePlayer.GetComponent<Text>().text = "Jugador: " + playerScore;
roundStatus.text = "Has ganado la ronda!";
roundStatus.color = Color.green;
correct.Play();
}
}

我认为它在以下行崩溃:

if (currentQuestion.answer == questionList[index].answer)

另外,如果我尝试以下行,它也会崩溃:

questionList.RemoveAt(index);

我收到以下错误:

ArgumentOutOfRangeException:Argument超出范围。 参数名称:索引

为什么会这样?

编辑:我已经看到来自QuestionCheck的索引总是15,为什么会发生这种情况?

这是范围问题。事件发生后,i已经处于超出数组范围的questionList.Count。您的所有QuestionCheck都将被调用questionList.Count(在您的情况下为 15

(您要做的是将i保存到临时值,并改用该值:

for (int i = 0; i < questionList.Count; i++)
{
var currentIndex = i;
GameObject child = Instantiate(questionButton, buttonLayout.transform);
child.GetComponent<Text>().text = questionList[i].answer;
child.GetComponent<Button>().onClick.AddListener(() => QuestionCheck(currentIndex ));
}

问题是您的onClick侦听器不是在循环内计算的,而是在单击按钮之后计算的。

child.GetComponent<Button>().onClick.AddListener(() => QuestionCheck(i));

因此,虽然 i 在循环运行时等于 0,1,3...14,但当您的按钮最终被单击时,循环早已结束,i 等于 15。

解决此问题的简单方法是创建另一个变量来保存当前值 i。

for (int i = 0; i < questionList.Count; i++)
{
int questionIndex = i;
GameObject child = Instantiate(questionButton, buttonLayout.transform);
child.GetComponent<Text>().text = questionList[questionIndex].answer;
child.GetComponent<Button>().onClick.AddListener(() => QuestionCheck(questionIndex));
}

参数超出范围意味着在您的情况下,您的列表有 3 个项目,并且它试图访问数字 4、5 或任何高于列表range或计数的内容。

还要记住,您的列表从 0 开始,因此您的项目是 0、1 和 2

而不是

for (int i = 0; i < questionList.Count; i++)
{
GameObject child = Instantiate(questionButton, buttonLayout.transform);
child.GetComponent<Text>().text = questionList[i].answer;
child.GetComponent<Button>().onClick.AddListener(() => QuestionCheck(i));
}

尝试

foreach(GameManager.Question q in questions){
GameObject child = Instantiate(questionButton, buttonLayout.transform);
child.GetComponent<Text>().text = q.answer;
child.GetComponent<Button>().onClick.AddListener(() => QuestionCheck(i));
}

相关内容

  • 没有找到相关文章

最新更新