可能重複:
C#: using the iterator variable of foreach loop in a lambda expression - why fails?這個委託爲什麼不在循環內部工作?
我讀在MSDN C#參考,我發現這個..
http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx
末註釋中有一條評論通過albionmike
這是這樣的..
When you "catpure" a variable from an outer scope, some counter-intuitive things happen.
If you run this, you will get an IndexOutOfRange exception during the call f().
If you uncomment the two commented out lines of code, it will work as expected.
Hint: Captured Outer Variables have reference rather than value semantics
// Console Project
using System;
using System.Collections.Generic;
using System.Text;
namespace EvilDelegation
{
delegate void PrintIt();
class Program
{
static void Main(string[] args)
{
string[] strings = { "zero", "one", "two", "three", "four" };
PrintIt f = null;
for (int i = 0; i < strings.Length; ++i) {
if (i == 2 || i == 3) {
// Can you see why this would not work?
f = delegate() { Console.WriteLine(strings[i]); };
// But this does...
//int k = i;
//f = delegate() { Console.WriteLine(strings[k]); };
}
}
f();
}
}
}
我不明白,爲什麼拳頭一個不行,第二個會呢?在第四行,他說:Captured Outer Variables have reference rather than value semantics
。
好的,很好。但是在for循環中,我們將i
定義爲int
,這當然是一個值類型,那麼int
類型如何保存一個引用?如果i
不能持有參考,這意味着它存儲的價值,如果它存儲的價值,那麼我不明白爲什麼第一個不會工作,第二個會?
我在這裏錯過了什麼?
編輯:我認爲最初的作者有一個錯字,調用f()應該在if循環中。請在回答時考慮這一點。
編輯2:好的,如果有人可能會說,這不是一個錯字,讓我們考慮它是。我想知道在if
條款內撥打f()
的情況。兩者都會在這種情況下運行,還是隻有沒有評論的那個?
這是從字面上[問18分鐘前](http://stackoverflow.com/questions/11524532/delegate-method-inside-foreach-loop-always-binds-to-last-item)。 – 2012-07-17 14:40:16
@KirkWoll 那麼,它不是我想出來的,並沒有搜查,我發現它在MSDN上,並不明白,因此在這裏問 – Razort4x 2012-07-17 14:41:49