7.1.8 委托中的协变和抗变

<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)
{
}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值