匿名デリゲートで TargetException が出てはまった
次のコードは hoge のコメントアウトを外すと動かなくなります。
public static void MyForEach<T>(T[] a, Delegate fun) { foreach (T o in a) { fun.Method.Invoke(fun, new object[] { o }); } } static void Main(string[] args) { object[] a = new object[]{ 1, 2, 3, 4 }; int hoge = 0; MyForEach(a, (Action<object>)delegate(object o) { Console.WriteLine(o); //hoge++; }); Console.Read(); }
こう書けば動きます。
fun.Method.Invoke(fun.Target, new object[] { o });
本来、Delegate.Invoke には Delegate.Target を指定するべきですが、間違えて fun を指定していました。
匿名デリゲートは外部の変数にアクセスしなければ、静的メソッドとしてコンパイルされます。その場合、Delegate.Target は null になるのですが、何を渡してもエラーにはならないようです。
しかし1ヶ所でも外部の変数にアクセスすれば、それを実現するための <>c__DisplayClass1 等の暗黙的なクラスをコンパイラが生成し、デリゲートがそのクラスのインスタンスメソッドに変化します。なので、正しいターゲットを指定しなければなりません。