我遇到了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 < names.Length; i++)
{
showNameDelegate += () => 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 < names.Length - 1; i++)
{
showNameDelegate += () => global::System.Console.WriteLine(names[i]);
}
foreach (Action showName in showNameDelegate.GetInvocationList())
{
showName();
}
这个答案是正确的(由Ed Plunkett撰写): 每个委托引用变量i。它们都引用变量,因此当它们执行时,它们将获得它当时拥有的任何值。在for循环完成后执行委托。那时,我等于名字.Length。在循环体中创建i的本地副本 - 或者使用foreach循环,它会自动修复此问题。
答案 0 :(得分:0)
您应该像这样更改代码;
for (int i = -1; i < names.Length - 1; i++)
{
string name = names[i];
showNameDelegate += () => global::System.Console.WriteLine(name);
}
或者您可以尝试使用foreach。