参考书籍: 《C#图解教程》
泛型是个好东西。很多模版类都用到泛型。
可以约束泛型,但有特定的顺序。在类后面加where 关键字
越详细的约束应该放在越靠前的地方。可以有任意多个接口约束。如果有构造函数约束,放在最后。对于泛型来说,想要把子类分配给父类的变量,就要用到协变。看代码:
class Animal { public int Legs = 4; } class Dog : Animal { } delegate T Factory<T>(); class Program2 { static Dog MakeDog() { return new Dog(); } static void Main(string[] args) { Factory<Dog> dogMaker = MakeDog; Factory<Animal> animalMaker = dogMaker; //报错,无法隐式转换 Console.WriteLine(animalMaker().Legs.ToString()); Console.ReadLine(); } }尽管Dog是Animal的子类,但Factory< Dog >并不是Factory< Animal>的子类,所以无法进行转换。这时候用协变就好了(添加out 关键字)。
delegate T Factory<out T>(); //out指定了类型参数的协变。和协变相似,逆变用 in 关键字指定类型参数。是从基类赋值给派生类。
显式变化使用in和out关键字只适用于委托和接口,不适用于类、结构和方法。
可以参考别人家的博客:对协变和逆变的简单理解