我在 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();
}
}
}
我不明白,为什么第一个不行,第二个不行?在第 4 行中,他说:Captured Outer Variables have reference rather than value semantics
.
好的。但是在for循环中,我们定义i
了int
which当然是值类型,那么类型怎么能int
持有引用呢?如果i
不能保持引用,这意味着它正在存储价值,如果它正在存储价值,那么我不明白为什么第一个不起作用而第二个会起作用?
我在这里错过了什么吗?
编辑:我认为原作者有一个错字,对 f() 的调用应该在 if 循环内。请在回答时考虑这一点。
编辑 2:好的,如果有人可能会说,这不是错字,让我们考虑一下。我想知道在f()
子句if
中调用的情况。在那种情况下都会运行,还是只运行一个没有评论的?