在“for”循环中添加委托更改迭代的方法 – C#问题?

我遇到了C#代码的一些问题。 添加方法以“for”循环委托“i”加1,所以“for(int i = 0,i <x; i ++)”必须更改为“for(int i = -1,i <x- 1; i ++)“正常工作。 这是为什么?

下面的代码抛出IndexOutOfRangeException

string[] names = new string[] { "John", "Madeline", "Jack", "Gabby" }; Action showNameDelegate = null; for (int i = 0; i  global::System.Console.WriteLine(names[i]); } foreach (Action showName in showNameDelegate.GetInvocationList()) { showName(); } 

正确的代码是(查看迭代器“i”,它从-1开始,但“names [-1]”不存在):

 string[] names = new string[] { "John", "Madeline", "Jack", "Gabby" }; Action showNameDelegate = null; for (int i = -1; i  global::System.Console.WriteLine(names[i]); } foreach (Action showName in showNameDelegate.GetInvocationList()) { showName(); } 

这个答案是正确的(由Ed Plunkett撰写):每个代表引用变量i。 它们都引用变量,因此当它们执行时,它们将获得它当时拥有的任何值。 在for循环完成后执行委托。 那时,我等于名字.Length。 在循环体中制作i的本地副本 – 或者使用foreach循环,它会自动修复此问题。

你应该改变你的代码;

 for (int i = -1; i < names.Length - 1; i++) { string name = names[i]; showNameDelegate += () => global::System.Console.WriteLine(name); } 

或者你可以尝试使用foreach。