あなたが見逃しているのは、//メソッドが定義されていないという事実だと思います-Invokeそれらはコンパイラによってデリゲートタイプに対して自動的に生成されます。BeginInvokeEndInvokeDelegate
最初に宣言したとき
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。不思議なことは何もありません。