Argument is out of range whilst using a for loop. Yet when I insert indexes manually it works fine (C#)
void moveChildren(Vector3[] captainNodes, bool pathsuccess, List<basic_unit_01> children){
for(int i = 0; i < children.Count; i++) {
if (obstacleCheck (children[i], captainNodes [0])) {
print(children[i].transform.position);
pathRequestManager.requestPath (children[i].transform.position, captainNodes[0], (childNodes, test) => addPaths(children[i], childNodes, captainNodes, test));
} else {
children[i].onPathFound (captainNodes, true);
}
}
}
Super confused. I've checked what values the for loop outputs, and when I insert the functions manually it is fine. The only thing I can think of is that my lambda expression may be messing things up due to me being a complete noob at using them. Thanks in advance.
Answer by Dave-Carlile · Jul 18, 2016 at 12:06 PM
You need to get a children[i]
reference into its own variable and pass that reference to the lambda. Because closures close over variables, not over values it's always seeing the last value assigned to i
, not whatever children[i] was when the delegate was created. It's a little confusing (still is to me and I have to re-read that blog every time it comes up) but you should be able to just make a copy into a separate variable so the closure can capture it.
var child = children[i];
pathRequestManager.requestPath(child, ...)
Another option would be to make a copy of the index itself...
int closureIndex = i;
pathRequestManager.requestPath(children[closureIndex]...
Worked like a charm, thanks! I'll make sure to read over that post so it doesn't happen again.
Your answer
Follow this Question
Related Questions
ArgumentOutOfRangeException: Argument is out of range. -> Index 2 Answers
Unknown Argument Out of Range Index Error On Card Game 1 Answer
How do I get my Inventory Loading to work again? ArgumentOutOfRangeException 2 Answers
UNET ArgumentOutOfRangeException 0 Answers
Problem when acessing a list from another script? (ArgumentOutOfRangeException) 0 Answers