デリゲートの共変性と反変性 (C# プログラミング ガイド)

更新 : 2007 年 11 月

共変性と反変性により、メソッドのシグネチャをデリゲート型に柔軟に一致させることができます。共変性により、メソッドの戻り値の型の派生をデリゲートに定義されている型より強くすることができます。反変性により、メソッドのパラメータ型の派生をデリゲート型より弱くすることができます。

例 1 (共変性)

説明

この例では、デリゲートと、デリゲートのシグネチャ内の戻り値の型から派生した戻り値の型を持つメソッドの使用方法を説明します。SecondHandler が返すデータ型は Dogs です。これは、デリゲートに定義された Mammals 型の派生型です。

コード

class Mammals
{
}

class Dogs : Mammals
{
}

class Program
{
    // Define the delegate.
    public delegate Mammals HandlerMethod();

    public static Mammals FirstHandler()
    {
        return null;
    }

    public static Dogs SecondHandler()
    {
        return null;
    }

    static void Main()
    {
        HandlerMethod handler1 = FirstHandler;

        // Covariance allows this delegate.
        HandlerMethod handler2 = SecondHandler;
    }
}

例 2 (反変性)

説明

この例では、デリゲートと、デリゲートのシグネチャのパラメータ型の基本型のパラメータを持つメソッドの使用方法を説明します。反変性により、以前は複数のハンドラを使用する必要があった場所で単一のイベント ハンドラを使用できるようになりました。たとえば、EventArgs 入力パラメータを受け付けるイベント ハンドラを作成し、MouseEventArgs 型のパラメータを送信する Button.MouseClick イベントや KeyEventArgs パラメータを送信する TextBox.KeyDown イベントで使用できるようになりました。

コード

System.DateTime lastActivity;
public Form1()
{
    InitializeComponent();

    lastActivity = new System.DateTime();
    this.textBox1.KeyDown += this.MultiHandler; //works with KeyEventArgs
    this.button1.MouseClick += this.MultiHandler; //works with MouseEventArgs

}

// Event hander for any event with an EventArgs or
// derived class in the second parameter
private void MultiHandler(object sender, System.EventArgs e)
{
    lastActivity = System.DateTime.Now;
}

参照

概念

C# プログラミング ガイド

参照

イベント (C# プログラミング ガイド)

デリゲート (C# プログラミング ガイド)

汎用デリゲート (C# プログラミング ガイド)