这些示例演示如何在泛型委托Func
和Action
中使用协变和逆变,以便重复利用方法,并在代码中提供更大的灵活性。
有关协变和逆变的详细信息,请参阅委托中的变体 (C#)。
使用具有协变类型参数的委托
下例阐释了泛型 Func
委托中的协变支持的益处。
FindByTitle
方法接收一个 String
类型的参数,并返回一个 Employee
类型的对象。 但是,您可以将此方法分配给Func<String, Person>
委托,因为Employee
继承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;
}
}
使用具有逆变类型参数的委托
下例阐释了泛型 Action
委托中的逆变支持的益处。
AddToContacts
方法传递一个 Person
类型的参数。 但是,您可以将此方法分配给Action<Employee>
委托,因为Employee
继承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;
}
}