ArgumentOutOfRangeException:参数超出范围
ArgumentOutOfRangeException: Argument is out of range
我有以下列表:
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 is out of range.
Parameter name: index
为什么会这样?
编辑:我看到 QuestionCheck 的索引总是 15,为什么会这样?
参数超出范围意味着在您的情况下您的列表有 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));
}
这是范围界定问题。一旦事件发生,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));
}
我有以下列表:
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 is out of range. Parameter name: index
为什么会这样?
编辑:我看到 QuestionCheck 的索引总是 15,为什么会这样?
参数超出范围意味着在您的情况下您的列表有 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));
}
这是范围界定问题。一旦事件发生,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));
}