<c#高级编程>
7.1.8 协变和抗变
委托调用的方法不需要与委托声明定义的类型相同。因此可能出现协变和抗变。
1. 返回类型协变
方法的返回类型可以派生于委托定义的类型。在下面的示例中,委托MyDelegate定义为返回DelegateReturn类型。赋予委托实例d1的方法返回DelegateReturn2类型,DelegateReturn2派生自DelegateReturn,因此满足了委托的需求。这称为返回类型协变。
public class DelegateReturn
{
}
public class DelegateReturn2 : DelegateReturn
{
}
public delegate DelegateReturn MyDelegate1();
class Program
{
static void Main()
{
MyDelegate1 d1 = Method1;
d1();
}
static DelegateReturn2 Method1()
{
DelegateReturn2 d2 = new DelegateReturn2();
return d2;
}
}
2. 参数类型抗变
术语"参数类型抗变"表示,委托定义的参数可能不同于委托调用的方法。这里是返回类型不同,因为方法使用的参数类型可能派生自委托定义的类型。在下面的示例代码中,委托使用的参数类型是DelegateParam2,而赋予委托实例d2的方法使用的参数类型是DelegateParam,
DelegateParam是DelegateParam2的基类。
public class DelegateParam
{
}
public class DelegateParam2 : DelegateParam
{
}
public delegate void MyDelegate2(DelegateParam2 p);
class Program
{
static void Main()
{
MyDelegate2 d2 = Method2;
DelegateParam2 p = new DelegateParam2();
d2(p);
}
static void Method2(DelegateParam p)
{
}
}