协变和逆变-Covariance and Contravariance

本文介绍了C#中的协变(Covariance)和逆变(Contravariance)概念,解释了这两种特性如何实现安全的类型转换,并通过示例说明了协变和逆变在C#中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C#4.0新特性介绍中,总是免不了对协变和逆变的介绍。但似乎协变逆变又很鸡肋。我试图简单地讲下协变(Covariance)和逆变(Contravariance)。

1,Co&Contravariance并非C#4.0引入的,早在C#1.0中就有了。只是C#4.0加入了对Generic Type的Co&Contravariance的支持。

2,Co&Contravariance是静态语言用来支持(安全的隐式)类型转换的技术。

3,Co&Contravariance都满足Liskov原则:子类可以替换基类(在需要较少信息的基类时候,可以提供较多信息的子类来替代)。

4,只支持引用类型,值类型则不支持。

 

Covariance

对Caller来说,需要返回一个基类。对Callee来说,实际返回了一个子类。看如下代码片段:

class Base{}
class Sub:Base{};
static Base SomeMethod()
{
    return new Sub();    //Sub casting up to Base.
}

Caller: Access Sub via Base

Callee: Return Sub for Base

从Callee的视角来看:子类安全地向上Casting——提供了更多信息.

 

Contravariance

对Callee来说,需要传入一个基类。对Caller来说实际传入一个子类。代码如下:

class Base{}
class Sub:Base{};
static void SomeMethod(Base b)
{
    Sub sb = (Sub)b;   //Base casting down to Sub
}
static void Main(string[] args)
{
    SomeMethod(new Sub());
}

 

Callee:Access Sub via Base

Caller:Pass Sub for Base

从Callee的角度来看:基类向下Casting——可以提供更多信息.

 

Reference

http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)

http://www.cnblogs.com/fox23/archive/2009/12/03/covariance-contravariance-in-csharp-4.html

http://www.cnblogs.com/Ninputer/archive/2008/11/22/generic_covariant.html

转载于:https://www.cnblogs.com/Jerry-Chou/archive/2010/04/29/1723664.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值