Func および Action 汎用デリゲート (Visual Basic) の変性の使用Using Variance for Func and Action Generic Delegates (C#)

以下の例では、Func 汎用デリゲートと Action 汎用デリゲートの共変性と反変性を使用して、メソッドの再利用を可能にし、コードの柔軟性を高める方法を示します。These examples demonstrate how to use covariance and contravariance in the Func and Action generic delegates to enable reuse of methods and provide more flexibility in your code.

共変性と反変性の詳細については、「デリゲートの変性 (C# )」を参照してください。For more information about covariance and contravariance, see Variance in Delegates (C#).

デリゲートと共変の型パラメーターの使用Using Delegates with Covariant Type Parameters

次の例は、Func 汎用デリゲートにおける共変性のサポートの利点を示しています。The following example illustrates the benefits of covariance support in the generic Func delegates. FindByTitle メソッドは、String 型のパラメーターを受け取り、Employee 型のオブジェクトを返します。The FindByTitle method takes a parameter of the String type and returns an object of the Employee type. ただし、このメソッドは Func<String, Person> デリゲートに割り当てることもできます。これは EmployeePerson を継承するためです。However, you can assign this method to the Func<String, Person> delegate because Employee inherits Person.

// Simple hierarchy of classes.  
public class Person { }  
public class Employee : Person { }  
class Program  
{  
    static Employee FindByTitle(String title)  
    {  
        // This is a stub for a method that returns  
        // an employee that has the specified title.  
        return new Employee();  
    }  
  
    static void Test()  
    {  
        // Create an instance of the delegate without using variance.  
        Func<String, Employee> findEmployee = FindByTitle;  
  
        // The delegate expects a method to return Person,  
        // but you can assign it a method that returns Employee.  
        Func<String, Person> findPerson = FindByTitle;  
  
        // You can also assign a delegate   
        // that returns a more derived type   
        // to a delegate that returns a less derived type.  
        findPerson = findEmployee;  
  
    }  
}  

デリゲートと反変の型パラメーターの使用Using Delegates with Contravariant Type Parameters

次の例は、Action 汎用デリゲートにおける反変性のサポートの利点を示しています。The following example illustrates the benefits of contravariance support in the generic Action delegates. AddToContacts メソッドは、Person 型のパラメーターを受け取ります。The AddToContacts method takes a parameter of the Person type. ただし、このメソッドは Action<Employee> デリゲートに割り当てることもできます。これは EmployeePerson を継承するためです。However, you can assign this method to the Action<Employee> delegate because Employee inherits Person.

public class Person { }  
public class Employee : Person { }  
class Program  
{  
    static void AddToContacts(Person person)  
    {  
        // This method adds a Person object  
        // to a contact list.  
    }  
  
    static void Test()  
    {  
        // Create an instance of the delegate without using variance.  
        Action<Person> addPersonToContacts = AddToContacts;  
  
        // The Action delegate expects   
        // a method that has an Employee parameter,  
        // but you can assign it a method that has a Person parameter  
        // because Employee derives from Person.  
        Action<Employee> addEmployeeToContacts = AddToContacts;  
  
        // You can also assign a delegate   
        // that accepts a less derived parameter to a delegate   
        // that accepts a more derived parameter.  
        addEmployeeToContacts = addPersonToContacts;  
    }  
}  

関連項目See also