C#基础:协变和抗变

           把泛型类型参数定义为斜变,可以使用out关键字,

接口 public interface Method<out T>{...}

对于接口定义  斜变可以作为参数返回值,或者属性的get;

           把泛型类型参数定义为抗变,可以使用in关键字,

接口 public interface Method<in T>{...}

对于接口定义  抗变只能作为方法参数。

示例代码如下:

  //斜变和抗变

Cow类继承Animal类

  1.            public static void Main(string[] args){
  2.            List<Cow> cows = new List<Cow>();
  3.             cows.Add(new Cow("Geronimo"));
  4.             cows.Add(new SuperCow("Tonto"));
  5.             cows.Add(new Cow("Gerald"));
  6.             cows.Add(new Cow("Phil"));
  7.             ListAnimals(cows);//斜变  在Animal类型中返回Cow类型
  8.             cows.Sort(new AnimalNameLengthCompare());//抗变  把Cow类型作为参数传给Animal类型排序
  9.             foreach (Cow item in cows)
  10.             {
  11.                 //Console.WriteLine(item.ToString());
  12.                 Console.WriteLine(item.Name);
  13.             }
  14. }
  15. //斜变   通过斜变可以把List<Cow>类型传给IEnumerable<Animal>类型中
  16.  public static void ListAnimals(IEnumerable<Animal> animals) {
  17.             foreach (Animal item in animals)
  18.             {
  19.                 Console.WriteLine(item.ToString());
  20.             }
  21.         } 
  22. //抗变  这个方法是对List<Animal>类型参数排序,通过抗变可以对List<Cow>的实例排序。
  23.  public class AnimalNameLengthCompare : IComparer<Animal>
  24.         {
  25.             public int Compare(Animal x, Animal y)
  26.             {
  27.                return x.Name.Length.CompareTo(y.Name.Length);
  28.             }
  29.         } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值