匿名デリゲートで 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 等の暗黙的なクラスをコンパイラが生成し、デリゲートがそのクラスのインスタンスメソッドに変化します。なので、正しいターゲットを指定しなければなりません。