C#基礎:協變和抗變
阿新 • • 發佈:2019-02-18
把泛型型別引數定義為斜變,可以使用out關鍵字,
介面 public interface Method<out T>{...}
對於介面定義 斜變可以作為引數返回值,或者屬性的get;
把泛型型別引數定義為抗變,可以使用in關鍵字,
介面 public interface Method<in T>{...}
對於介面定義 抗變只能作為方法引數。
示例程式碼如下:
//斜變和抗變
Cow類繼承Animal類
- public static void Main(string[] args){
- List<Cow> cows = new List<Cow>();
- cows.Add(new Cow("Geronimo"));
- cows.Add(new SuperCow("Tonto"));
- cows.Add(new Cow("Gerald"));
- cows.Add(new Cow("Phil"));
- ListAnimals(cows);//斜變 在Animal型別中返回Cow型別
- cows.Sort(new AnimalNameLengthCompare());//抗變 把Cow型別作為引數傳給Animal型別排序
- foreach (Cow item in cows)
- {
- //Console.WriteLine(item.ToString());
- Console.WriteLine(item.Name);
- }
- }
- //斜變 通過斜變可以把List<Cow>型別傳給IEnumerable<Animal>型別中
- public static void ListAnimals(IEnumerable<Animal> animals) {
- foreach (Animal item in animals)
- {
- Console.WriteLine(item.ToString());
- }
- }
- //抗變 這個方法是對List<Animal>型別引數排序,通過抗變可以對List<Cow>的例項排序。
- public class AnimalNameLengthCompare : IComparer<Animal>
- {
- public int Compare(Animal x, Animal y)
- {
- return x.Name.Length.CompareTo(y.Name.Length);
- }
- }