泛型协变和抗变
/* 泛型协变和抗变 .net 4.0增加的特性 参数是可以协变的 方法返回类型是抗变的 */ namespace Frank { public class Test { public static void Main(string[] args) { Rectangle s = new Rectangle(); Rectangle r = new Rectangle(); r.Set(s);//协边,需要基类型,但是可以传递子类型的引用,总是隐士的。 //Rectangle r2 = r.Get();//抗变,需要显示。因为返回的父类型不一定总是子类型中的Rectangle类型 Rectangle r3 = new Rectangle(); System.Console.WriteLine(r3[0]);//访问索引器 } } public class Shape { public double Width{get;set;} public double Height{get;set;} public override string ToString() { return string.Format("Width:{0},Height:{1}",Width,Height); } } public class Rectangle : Shape { public void Set(Shape s) { } public Shape Get() { return new Shape{Width=20,Height=10}; } public Rectangle this[int index]//自定义索引器 { get { return new Rectangle{Width=1,Height=2}; } } } public interface Test2<out T>//定义一个泛型接口,用out声明是协变的 返回输出类型只能是T类型 { T this[int index]{get;} } public interface Test3<in T>//定义一个泛型接口,用in声明是抗变的,只能把T类型作为方法的输入类型 { void Show(T show); }