Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在for循环期间创建的操作委托不考虑;对于变量“;在委托方法中用作参数时的值_C#_Loops_Delegates - Fatal编程技术网

C# 在for循环期间创建的操作委托不考虑;对于变量“;在委托方法中用作参数时的值

C# 在for循环期间创建的操作委托不考虑;对于变量“;在委托方法中用作参数时的值,c#,loops,delegates,C#,Loops,Delegates,Noob,如果我没有正确使用术语,我道歉 下面的每个代码块都以字母列表{“a”,“c”}开始,并创建一个动作委托,以便稍后在“c”之前插入“b” 我发现,当我使用“for variable”时,I,作为List.Insert()的索引参数时,当我稍后调用动作委托时,传递的值不受尊重。但是如果我在一个新的int中捕获I,并在创建动作委托时传递该值,那么该值将得到尊重。此外,如果我在创建动作委托的迭代中检查变量I和index,它们都具有相同的值:1 我希望这两个代码块都会返回“abc”,但显然它们不

Noob,如果我没有正确使用术语,我道歉

下面的每个代码块都以字母列表
{“a”,“c”}
开始,并创建一个动作委托,以便稍后在
“c”
之前插入
“b”

我发现,当我使用“for variable”时,
I
,作为
List.Insert()
的索引参数时,当我稍后调用动作委托时,传递的值不受尊重。但是如果我在一个新的
int
中捕获
I
,并在创建动作委托时传递该值,那么该值将得到尊重。此外,如果我在创建动作委托的迭代中检查变量
I
index
,它们都具有相同的值:
1

我希望这两个代码块都会返回“abc”,但显然它们不会

为什么这两组代码的行为不同?

此代码输出“acb”:

公共无效测试()
{
列表字母=新列表(){“a”,“c”};
列表操作=新建列表();
for(int i=0;i字母。插入(i,“b”));
}
}
对于(int i=actions.Count-1;i>-1;i--)
行动[一]();
foreach(字母中的var字母)
写(信);
}
此代码输出“abc”:

公共无效测试()
{
列表字母=新列表(){“a”,“c”};
列表操作=新建列表();
for(int i=0;i字母插入(索引,“b”));
}
}
对于(int i=actions.Count-1;i>-1;i--)
行动[一]();
foreach(字母中的var字母)
写(信);
}

它的名字叫closure@insane\u developer,谢谢!这些信息非常有用
        public void Test()
        {
            List<string> letters = new List<string>() { "a", "c" };
            List<Action> actions = new List<Action>();
            for (int i = 0; i < letters.Count; i++)
            {
                string letter = letters[i];
                if (letter == "c")
                {
                    actions.Add(new Action(() => letters.Insert(i, "b")));
                }
            }

            for (int i = actions.Count - 1; i > -1; i--)
                actions[i]();

            foreach (var letter in letters)
                Debug.Write(letter);
        }
        public void Test()
        {
            List<string> letters = new List<string>() { "a", "c" };
            List<Action> actions = new List<Action>();
            for (int i = 0; i < letters.Count; i++)
            {
                string letter = letters[i];
                if (letter == "c")
                {
                    int index = i; // Using "index" instead of i when creating the action
                    actions.Add(new Action(() => letters.Insert(index, "b")));
                }
            }

            for (int i = actions.Count - 1; i > -1; i--)
                actions[i]();

            foreach (var letter in letters)
                Debug.Write(letter);
        }