1. 程式人生 > >C#基礎:協變和抗變

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.         }