For loop 为什么';对于在';允许关闭吗?

For loop 为什么';对于在';允许关闭吗?,for-loop,foreach,f#,closures,immutability,For Loop,Foreach,F#,Closures,Immutability,闭包中不允许使用可变值,但..的。。在中,表达式正常。在C#中,for循环更新迭代器,但在F#中似乎没有。如何以及为什么?F#的。。in相当于C#的foreach循环,而不是C#的for循环。由于C#5,foreach循环不会更新迭代器;相反,它会为循环中的每个迭代创建一个新变量(这对闭包有重要影响;有关详细信息,请参阅。这也是F#所做的:如果您编写 for txt in ["abc"; "def"; "ghi"] do printfn "%s" txt 然后,在运行该循环时,实际上创

闭包中不允许使用可变值,但..的
。。在
中,表达式正常。在C#中,for循环更新迭代器,但在F#中似乎没有。如何以及为什么?

F#的
。。in
相当于C#的
foreach
循环,而不是C#的
for
循环。由于C#5,foreach循环不会更新迭代器;相反,它会为循环中的每个迭代创建一个新变量(这对闭包有重要影响;有关详细信息,请参阅。这也是F#所做的:如果您编写

for txt in ["abc"; "def"; "ghi"] do
    printfn "%s" txt
然后,在运行该循环时,实际上创建了三个新的字符串变量,而不仅仅是一个

为了向自己证明F#每次都在创建一个新变量,请尝试以下不太实用的代码:

let actions = new System.Collections.Generic.List<System.Action<unit>>()
for txt in ["abc"; "def"; "ghi"] do
    actions.Add(fun () -> printf "%s " txt)
for action in actions do
    action.Invoke()
let actions=new System.Collections.Generic.List()
对于[“abc”;“def”;“ghi”]do中的txt
actions.Add(fun()->printf“%s”txt)
行动中的行动
action.Invoke()
如果
txt
每次通过
for..in
循环时都是相同的变量,这将打印
ghi ghi
,就像C#4和更早版本一样——因为匿名函数在变量上闭合,循环后变量包含
ghi
。但是如果运行上述代码,您将看到它在nts
abc def ghi
,就像C#5和更高版本一样


所以你的问题的答案是F#允许在闭包中对..进行
,因为它实际上没有改变任何东西

很好的答案,thanx。