關(guān)于協(xié)變逆變,SolidMango的解釋是比較可取的。有了協(xié)變,比如,在需要返回IEnumerable<object>類型的時(shí)候,可以使用IEnmerable<string>來替代;有了逆變,比如,在需要接收IComparable<string>類型形參方法中,可以使用IComparable<object>類型實(shí)參來替代。
協(xié)變
先來體會(huì)協(xié)變。有2個(gè)具有繼承關(guān)系的父類和子類。
public class Animal{public string Name { get; set; }}public class Dog : Animal{public Dog(string dogName){Name = dogName;}}
現(xiàn)在有一個(gè)幫助類的方法的形參類型是父類集合IEnumerable<Animal>。
public class MyHelper{public void PRintAnimalNames(IEnumerable<Animal> animals){foreach (var animal in animals){Console.WriteLine(animal.Name);}}}
有了協(xié)變,可以在PrintAnimalNames方法中傳入IEnumerable<Dog>類型的實(shí)參替代IEnumerable<Animal>類型。
static void Main(string[] args){List<Dog> dogs = new List<Dog>(){new Dog("小狗petty"),new Dog("小狗lily")};//協(xié)變IEnumerable<Animal> animals = dogs;MyHelper myHelper = new MyHelper();myHelper.PrintAnimalNames(animals);Console.ReadKey();}
可見,在方法中基于基類接口類型的形參,調(diào)用該方法的時(shí)候可以傳入派生類接口類型的實(shí)參。
逆變
再來體會(huì)逆變。依然是2個(gè)具有繼承關(guān)系的父類和子類。
public class Animal{
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注