为什么要使用泛型(泛型可以继承的):
1,重用代码;
2,类型安全:编译时检查,尽早暴露问题(相对object而言);
3,提高性能:编译时生成,避免装箱/拆箱;
泛型的类型约束where T:
1,struct:只能是值类型,由struct定义;
2,class:只能是引用类型,class定义;
3,new():必须包含一个公共的无参构造函数;
4,person:只能是person及其子类;
5,ISort:只能是ISort及其实现;
可以为多个泛型参数定义多个约束,也可以为一个泛型参数定义多个不冲突的约束;
只有接口或委托的泛型才能声明变体:
协变(covariance)out:子类可以给父类,IEnumerable<T>,IEnumerator<T>等;
逆变(contra variance)in:父类可以给子类,IComparer<T>,IComparable<T>等;