爱站网关键词排名,开网店的步骤和流程,学校网站建设营运预算,中国电商公司排名C#泛型——约束|协变|逆变
1、泛型使用
在生命时可以使用#xff0c;可以写一个标识符代替一些数据类型#xff0c;在声明时给出明确定义。 非常强大#xff0c;因此需要约束。
2、泛型约束
where T: struct//值类型约束#xff0c;要求泛型必须为基本数据类型…C#泛型——约束|协变|逆变
1、泛型使用
在生命时可以使用可以写一个标识符代替一些数据类型在声明时给出明确定义。 非常强大因此需要约束。
2、泛型约束
where T: struct//值类型约束要求泛型必须为基本数据类型 where T: class //引用类型约束要求泛型必须为类类型 where T: new()//默认构造方法约束要求泛型必须有默认构造方法抽象类abstract、接口interface、密封类sealed等都不可以 多重约束之间用逗号隔开
3、泛型协变与逆变
1协变子转父与逆变父转子
泛型是一种不指定的数据类型不同的泛型之间没有继承关系。 但通过泛型定义的类在使用时需要指定泛型的具体类型这些具体类型之间有时会具备父子关系。 通常情况下同一个使用泛型的类在不同具体的实例化的同时对象引用之间不允许相互赋值。 也就是说A和A之间没有父子关系默认为不变关系没有关系。 这个时候逆变、协变、和不变关系只能自己声明。
2使用泛型时协变与逆变的声明out/in
delegate T d1out T ();//协变声明
delegate void d2in T (T t);//逆变声明声明协变泛型后 使用子类的委托对象 可以向 使用父类泛型的委托引用 赋值
d1Dog d11 MakeAnimal;
d1Animal d12 d11;声明逆变泛型后 使用父类的委托对象 可以向 使用子类泛型的委托引用 赋值
d2Animal d21 MakeAnimal2;
d2Dog d22 d21;协变泛型只能做返回值逆变泛型只能做参数。
3适用范围
泛型接口和泛型委托。 个人感觉是因为泛型接口和泛型委托只能出现在赋值表达式的左侧作为被赋值的一方 泛型类有可能不需要声明引用泛型方法不可能作为对象引用出现在赋值表达式的左侧。