把泛型类型参数定义为斜变,可以使用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);
- }
- }