【C#-泛型约束】学习笔记
泛型约束
泛型约束:对泛型类型参数施加限制,用于限制可以传递到该类型参数的类型种类,共有6种
基本语法:
1 | class MyGeneric<T> where T : struct/class/new()/<base class name>/<interface name> |
结构约束 where T : struct
T必须是值类型,可以指定除 Nullable 以外的任何值类型
(值类型有int、float、char、bool、struct、enum、byte等,值类型声明后被直接分配内存)
1 | public class MyGeneric<T> where T : struct { } |
类关键词约束 where T : class
T必须是引用类型,包括任何类、接口、委托或数组类型
(引用类型有string和class,引用类型被声明时只在栈中分配一小片内存用于容纳一个地址,其实例被创建时,才会为其在堆中分配内存,并将堆中被分配的内存地址保存到栈中)
1 | public class MyGeneric<T> where T : class { } |
接口名约束 where T : <interface name>
T必须继承所给名称的指定接口,并实现其中的所有方法
可以指定多个接口约束
1 | public interface IMyInterface |
类名约束 where T : <base class name>
T必须是该类本身或是该类的子类
1 | public class A { } |
构造约束 where T : new()
T必须具有无参数的公共构造函数
当与其他约束一起使用时,new() 约束必须最后指定
1 | public class A{} |
泛型约束的应用
例:
1 | public class MyBaseGeneric<T> where T : MyGeneric<T> { } |
采用了**“类名约束”**
根据定义:T必须是该类本身或是该类的子类,即T必须是MyBaseGeneric
故当有其他类MyGeneric想要继承MyBaseGeneric
写法为:
1 | public class MyGeneric : MyBaseGeneric<MyGeneric> { } |
这样便通过类名泛型约束限制了泛型T
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hmxs's Blog!
评论