値型/参照型 に川俣さんからトラックバックいただきましたわーい → C#2.0において、値型と参照型の境界線はどこにあるのか?
そーなのよ。C#2.0では値型が参照型であるかのような挙動を示すことがあるます。
川俣さんが挙げてくれた例はつまりこゆこと。
class Program {
delegate int DoSomething();
// n回actionを呼び、最終結果を返す
static int Repeat(int n, DoSomething action) {
int result = 0;
while ( n-- != 0 ) result = action();
return result;
}
public static void Main() {
int n = 0;
int result = Repeat(4,delegate () { return ++n; });
System.Console.WriteLine(result);
System.Console.WriteLine(n);
}
}
値型であるint nを匿名delegateの中で書き換えてます。
ってーことはいつのまにかrefをつけちゃったことになる。
さらにこんなことも。
static DoSomething ReturnSomething() {
int n = 0;
return delegate () { return ++n; }; // Ω ΩΩ < なんだってー!?
}
public static void Main() {
int result = Repeat(4,ReturnSomething());
System.Console.WriteLine(result);
}
とんでもねーです。
ReturnSomething() 内のローカルな値型変数nを関数外に引きずり出して書き換えてます。
メソッドを抜けてこの世から消えてなくなったハズの値型変数を。