标签:就会 模板 关系 直接 情况 类的变量 调用 === str
类型不是对象,而是对象的模板
泛型不是类型,而是类型的模板
泛型:
1.c#中的泛型只在类、结构、接口、委托、方法中有
泛型类:
创建“构造类型”===就是给”类型参数“赋予”类型实参“
泛型类的构造出的类型都是不同的并且相互独立的
泛型的使用使得代码减少便于维护,但是不容易写,因为太抽象
类型参数的约束:
就是给泛型的“T”一个限定条件,让编译器知道什么类型可以用什么类型不可以用-------约束
泛型中不能处理一些类型的对象,或者不是object的派生类,否则会报错
where语句:
约束都是用where语句列出的,多个约束就用逗号分隔。 多个where语句间没有什么间隔符
where语句没有任何的次序,但是语句的内部有严格的顺序:类名---class(引用类型)---struct(值类型)---接口名---new()(无参构造的类型)
主约束只能有一个(前三个),接口可以有多个,构造约束只能放在最后。
泛型方法:
可以在泛型和非泛型的类、接口、结构中
泛型方法也可以有约束子句,
泛型方法中如果泛型方法的方法参数和泛型参数一样,在实例调用时就可以不用写出泛型的实参类型
例如:
public void MyMethod <T> (T myVal){}
int myInt = 2;
MyMethon<int>(myInt);-------------正常书写
MyMethon(myInt);----------------简写,推断类型,这样书写编译器可以推断出这个方法的泛型和方法参数是一样的,所以不用写出来了。
泛型类和扩展方法:
理解:在使用一个类时,先定义个静态类(static)类,在这个类中书写一个静态方法(static),方法的参数就是以要使用类类型,不过必须要有this关键字(this Holder<T> h),然后在我们实例要使用的类,就可以直接类的对象调用才写的类方法。调用时不需要参数的,因为就是这个类型对象调用的。
泛型结构:
和泛型类一样
泛型委托:
参数类型<形参类型,返回值类型>,也可以有约束条件
C#中的两个泛型委托:FUNC(T,result)有返回值的 Action(T)没有返回值的
泛型接口:
泛型的接口,要不是方法参数“泛型”,要不就是返回值”泛型“,要不就是都”泛型“
泛型接口最好是泛型类来实现,如果是非泛型类实现,就会在实现的时候写明一个唯一的类型实参(那还定义泛型干嘛)!!!
泛型接口名称和非泛型接口名称不会冲突的
实现泛型接口时要注意防止出现类型实参相同的情况,否则会出现方法一样的情况出现报错
协变:
派生类对象可以赋值给基类的变量这是赋值兼容性。 派生类的引用赋值给基类变量
当派生类的委托实现赋值,再把派生类的委托赋值给基类的委托,发现这个是不行的!!!!因为这是两个委托,理论上是两个不一样的委托没有什么关系的。没有继承关系的,这时的赋值是不会成功的。这是的同级使得不能赋值。在泛型委托中的泛型参数中加”out“,就可以编译成功。
这样的只用返回值类的类型参数的皆可用派生类创建的委托类型 叫做协变
在泛型参数中用”in“,并且委托是只有泛型参数的,叫做逆变
标签:就会 模板 关系 直接 情况 类的变量 调用 === str
原文地址:https://www.cnblogs.com/liuqifeng/p/9370143.html