私はMSDNでc#リファレンスを読んでいて、これを見つけました。
http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx
コメントの最後に1つのコメントがあります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();
}
}
}
わからない、なぜ最初のものが機能しないのか、そして2番目のものが機能するのか?4行目で、彼は次のように述べていますCaptured Outer Variables have reference rather than value semantics
。
じゃ、いいよ。しかし、forループでは、もちろん値型であると定義i
したint
ので、型はどのようint
に参照を保持できますか?そして、i
参照を保持できない場合、それは値を格納していることを意味し、値を格納している場合、最初のものが機能せず、2番目のものが機能する理由がわかりませんか?
ここで何かが足りませんか?
編集:元の作者にはタイプミスがあったと思います。f()の呼び出しはifループ内にあるはずです。答えるときはこれを考慮してください。
編集2:さて、誰かが言うかもしれない場合に備えて、それはタイプミスではなかった、それがあったと考えてみましょう。節f()
の中で呼び出しが行われる場合を知りたい。if
その場合、両方が実行されますか、それともコメントされていない方だけが実行されますか?