一个简单例子理解C#的协变和逆变

王朝学院·作者佚名  2016-05-20  
宽屏版  字体: 小 | 中 | 大 | 超大  

一个简单例子理解C#的协变和逆变

关于协变逆变,SolidMango的解释是比较可取的。有了协变,比如,在需要返回IEnumerable<object>类型的时候,可以使用IEnmerable<string>来替代;有了逆变,比如,在需要接收IComparable<string>类型形参方法中,可以使用IComparable<object>类型实参来替代。

协变

先来体会协变。有2个具有继承关系的父类和子类。

public class Animal

{

public string Name { get; set; }

}

public class Dog : Animal

{

public Dog(string dogName)

{

Name = dogName;

}

}

现在有一个帮助类的方法的形参类型是父类集合IEnumerable<Animal>。

public class MyHelper

{

public void PRintAnimalNames(IEnumerable<Animal> animals)

{

foreach (var animal in animals)

{

Console.WriteLine(animal.Name);

}

}

}

有了协变,可以在PrintAnimalNames方法中传入IEnumerable<Dog>类型的实参替代IEnumerable<Animal>类型。

static void Main(string[] args)

{

List<Dog> dogs = new List<Dog>()

{

new Dog("小狗petty"),

new Dog("小狗lily")

};

//协变

IEnumerable<Animal> animals = dogs;

MyHelper myHelper = new MyHelper();

myHelper.PrintAnimalNames(animals);

Console.ReadKey();

}

可见,在方法中基于基类接口类型的形参,调用该方法的时候可以传入派生类接口类型的实参。

逆变

再来体会逆变。依然是2个具有继承关系的父类和子类。

public class Animal

{

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有