Action
は .NET 3.5 フレームワークで、引数を取らず何も返さない一般的なデリゲートとして追加されましたがMethodInvoker
、1.1 から存在していたため、通常は を使用した古いコードのみが表示されますMethodInvoker
。2 つのデリゲート型の署名は同じです。
BeginInvoke()
実際にはDelegate
オブジェクトを取るので、引数を取らないデリゲートはそのオーバーロードで使用できます。((Delegate, object[])
引数が必要なデリゲートにはオーバーロードがありますが、代わりに引数なしのクロージャーを使用する傾向があります。)
は一般的な型であるためDelegate
、提供するデリゲートの型をなんらかの方法で指定する必要があります。コンパイラはそれ以外の方法では推論できないためです (以下を参照)。これはnew Action
代替案よりも短いですが、数文字だけであり、多かれ少なかれ明確ではありません。
this.BeginInvoke((Action)(() => { ... }));
コンパイラは必要なデリゲート型を認識できないため、ここでデリゲート型を指定する必要があります。例えば:
Action foo = () => { };
foo
これが機能するのは、デリゲート型が であるべきの型に基づいてコンパイラが推論できるためAction
です。
// All of these examples cause CS1660.
Delegate foo1 = () => { };
object foo2 = () => { };
var foo3 = () => { };
これらはコンパイル時のエラーです。署名に一致する多くのデリゲート型が「引数を取らずに戻りますvoid
」があり、コンパイラはどれが必要かを認識していないためです。(また、object
andのvar
場合、Expression<>
デリゲートではないオブジェクトを意味している可能性もあります。ただしdelegate () {}
、ラムダ式の代わりに使用すると、同じエラーが発生します。)