CLR via C# 泛型 委托和接口的逆变和协变泛型类型参数

委托的每个泛型类型参数都可以标记为协变量或逆变量。(协变性指定返回类型的兼容性,而逆变性指定参数的兼容性)利用这个功能,可将泛型委托类型的变量转换为相同的委托类型(但泛型参数类型不同)。泛型类型参数可以是以下任何一种形式。

1.不变量(invariant) 意味着泛型类型参数不能改变。

2.逆变量(contravariant)意味着泛型类型参数可以从一个类更改为它的某个派生类。在C#是用in关键字标记逆变量形式的泛型参数。逆变量泛型类型参数只出现在输入位置,比如作为方法的参数。

3.协变量(covariant)意味着泛型类型参数可以从一个类更改为它的某个基类。C#是用out关键字标记协变量形式的泛型类型参数。协变量泛型类型参数只能出现在输出位置,比如作为方法的返回类型。

例如:

其中,泛型类型参数T用in关键字标记,这使它成为逆变量;泛型类型参数TResult用out关键字标记,这使它成为协变量。

所以,像下面这样:

fn1变量引用一个方法,获取一个object,返回一个ArgumentException。而fn2变量引用另一个方法,获取一个string返回一个Exception。由于可将一个string传给期待object的方法(因为string从object派生),而且由于可以获取返回ArgumentException的一个方法的结果,并将这个结果当成一个Exception(因为Exception是ArgumentException的基类),所以上述代码正常编译,而编译时能维持类型安全性。

//--

只有编译器能验证类型之间存在引用转换,这些可变性才有用。换言之,由于需要装箱,所以值类型不具有这种可变性。

//--

使用要获取泛型参数和返回值的委托时,建议尽量为逆变性和协变性指定in和out关键字。这样做不会有不良反应,并使你的委托能在更多的情形中使用。

//--

和委托相似,具有泛型类型参数的接口也可以将雷星星参数标记为逆变量和协变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值