あなたが見逃しているのは、//メソッドが定義されていないという事実だと思います-Invoke
それらはコンパイラによってデリゲートタイプに対して自動的に生成されます。BeginInvoke
EndInvoke
Delegate
最初に宣言したとき
public delegate void SomeDelegate(String p);
コンパイラは以下を生成します:
public class SomeDelegate : Delegate
{
public SomeDelegate(Object target, IntPtr method) { ... }
public virtual IAsyncResult BeginInvoke(string p,
AsyncCallback callback, object @object) { ... }
public virtual void EndInvoke(IAsyncResult result) { ... }
public virtual void Invoke(string p) { ... }
}
(適切なメソッド本体、属性などを使用)。
SomeDelegateの署名を変更してパラメーターを削除すると、生成されるタイプは次のように変更されます。
public class SomeDelegate : Delegate
{
public SomeDelegate(Object target, IntPtr method) { ... }
public virtual IAsyncResult BeginInvoke(
AsyncCallback callback, object @object) { ... }
public virtual void EndInvoke(IAsyncResult result) { ... }
public virtual void Invoke() { ... }
}
本当に動的なことは何も起こっていません-あなたはの署名を変更しましたSomeDelegate
、そしてそれはの署名を変更しますSomeDelegate.BeginInvoke
。不思議なことは何もありません。