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*, captainNodes [0])) {*
_ print(children*.transform.position);_
pathRequestManager.requestPath (children_.transform.position, captainNodes[0], (childNodes, test) => addPaths(children, childNodes, captainNodes, test));
} else {
children.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._

1 Answer

1

You need to get a children_reference into its own variable and pass that reference to the lambda. Because [closures close over variables, not over values][1] it’s always seeing the last value assigned to i, not whatever children 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*;*
pathRequestManager.requestPath(child, …)
Another option would be to make a copy of the index itself…
int closureIndex = i;
pathRequestManager.requestPath(children[closureIndex]…
_*[1]: https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop-variable-considered-harmful/*_

Worked like a charm, thanks! I'll make sure to read over that post so it doesn't happen again.