五种泛型约束
1.where T : struct
- 作用:强制泛型只能是值类型(int、bool、struct)
- 特性:值类型默认不允许赋值
null
2.where T : class
- 作用:强制泛型只能是引用类型(自定义类、string、接口)
- 特性:变量可以赋值为
null。
3.where T : new()
- 作用:要求类型必须具备无参构造函数
- 限制:抽象类、只存在带参构造的普通类无法满足该约束;
- 用途:可以在泛型内部使用
new T()实例化对象。
4. 基类约束where T : 父类名称
publicclassRepository<T>whereT:BaseEntity约束含义:T必须是BaseEntity的子类。
之前代码能够直接书写
entity.Id的根本原因:编译器通过约束判定 T 继承 BaseEntity,必然包含 Id 属性。
5. 接口约束where T : 接口名称
publicinterfaceIHasName{stringName{get;set;}}publicclassDemo<T>whereT:IHasName{}要求泛型类型必须实现指定接口。
多约束叠加规则
多个约束为并且 (&&)关系,必须全部满足,书写顺序固定不可打乱:
基类(父类)约束 → 接口约束 → class/struct → new() ```csharp // 示例:T继承BaseEntity、实现2个接口、属于引用类型、有无参构造 public void Save<T>(T entity) where T : BaseEntity, IHasName, ILog, class, new() { }