4
static void HandleDemoEvent(object sender, EventArgs e)
{
    Console.WriteLine("bla-bla");
}

static void Main(string[] args)
{
    EventHandler handler;
    MouseEventHandler mouseHandler;

    handler = HandleDemoEvent; //Line#1 - Compile OK
    mouseHandler = HandleDemoEvent; //Line#2 - Compile OK
    mouseHandler = handler; //Line#3 Compile Error  1   Cannot implicitly convert type 'System.EventHandler' to 'System.Windows.Forms.MouseEventHandler'

}

EventHandlerデリゲート型と独自のメソッドの両方HandleDemoEventが同じメソッド シグネチャを持っています。それでも、Line#2 は正常にコンパイルされますが (反変性が作用)、Line#3 は失敗した暗黙の型キャスト エラーで失敗します。簡単な例ですが、Line#3 でコンパイル エラーが発生する理由は直感的に理解できますが、形式的な説明で解決することはできません。違いを説明するのに十分な理解を思いつくことができますか?

4

1 に答える 1

3

デリゲートの共変性/反変性は、最初の 2 つのケースのように、メソッドからデリゲートを作成する場合にのみ機能します。

最後のケースのように、あるデリゲートを別のデリゲートに割り当てる場合は機能しません。(ジェネリック デリゲートを使用しない限り、その場合、ジェネリック パラメーターで共/反変性を使用できます。)

AnEventHandlerは - ではありませんが、どちらも anと anを取るメソッドをMouseEventHandlerラップできます。voidobjectEventArgs

于 2012-08-14T10:22:28.207 に答える