デリゲートの分散の使用 (C#)Using Variance in Delegates (C#)

メソッドをデリゲートに割り当てると、"共変性" と "反変性" により、デリゲート型をメソッドのシグネチャに柔軟に一致させることができます。When you assign a method to a delegate, covariance and contravariance provide flexibility for matching a delegate type with a method signature. 共変性により、メソッドの戻り値の型の派生を、デリゲートに定義されている型よりも強くできます。Covariance permits a method to have return type that is more derived than that defined in the delegate. また、反変性により、メソッドのパラメーター型の派生をデリゲート型よりも弱くできます。Contravariance permits a method that has parameter types that are less derived than those in the delegate type.

例 1: 共変性Example 1: Covariance

説明Description

この例は、デリゲート シグネチャ内の戻り値の型から派生した戻り値の型を持つメソッドで、デリゲートをどのように使用できるかを示しています。This example demonstrates how delegates can be used with methods that have return types that are derived from the return type in the delegate signature. DogsHandler が返すデータ型は Dogs です。これは、デリゲートに定義された Mammals 型の派生型です。The data type returned by DogsHandler is of type Dogs, which derives from the Mammals type that is defined in the delegate.

コードCode

class Mammals{}  
class Dogs : Mammals{}  

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

    public static Mammals MammalsHandler()  
    {  
        return null;  
    }  

    public static Dogs DogsHandler()  
    {  
        return null;  
    }  

    static void Test()  
    {  
        HandlerMethod handlerMammals = MammalsHandler;  

        // Covariance enables this assignment.  
        HandlerMethod handlerDogs = DogsHandler;  
    }  
}  

例 2: 反変性Example 2: Contravariance

説明Description

この例は、パラメーターの型がデリゲート シグネチャ パラメーター型の基本データ型であるメソッドで、デリゲートをどのように使用できるかを示しています。This example demonstrates how delegates can be used with methods that have parameters of a type that are base types of the delegate signature parameter type. 反変性により、複数のハンドラーの代わりに単一のイベント ハンドラーを使用できます。With contravariance, you can use one event handler instead of separate handlers. たとえば、EventArgs 入力パラメーターを受け取るイベント ハンドラーを作成し、そのイベント ハンドラーを、MouseEventArgs 型をパラメーターとして送信する Button.MouseClick イベントや KeyEventArgs パラメーターを送信する TextBox.KeyDown イベントで使用できます。For example, you can create an event handler that accepts an EventArgs input parameter and use it with a Button.MouseClick event that sends a MouseEventArgs type as a parameter, and also with a TextBox.KeyDown event that sends a KeyEventArgs parameter.

コードCode

// Event handler that accepts a parameter of the EventArgs type.  
private void MultiHandler(object sender, System.EventArgs e)  
{  
    label1.Text = System.DateTime.Now.ToString();  
}  

public Form1()  
{  
    InitializeComponent();  

    // You can use a method that has an EventArgs parameter,  
    // although the event expects the KeyEventArgs parameter.  
    this.button1.KeyDown += this.MultiHandler;  

    // You can use the same method   
    // for an event that expects the MouseEventArgs parameter.  
    this.button1.MouseClick += this.MultiHandler;  

}  

関連項目See Also

デリゲートの分散 (C#)Variance in Delegates (C#)
Func および Action 汎用デリゲートでの分散の使用 (C#)Using Variance for Func and Action Generic Delegates (C#)