C#面试常考随笔13: 泛型的主要约束和次要约束是什么?

在 C# 泛型中,主要约束和次要约束用于限制泛型类型参数的使用,确保类型参数满足一定的条件,从而提高代码的可靠性和可维护性。以下是主要约束和次要约束的详细介绍:

主要约束

  • 引用类型约束(class):表示泛型类型参数必须是引用类型,包括类、接口、委托和数组类型等。例如,定义一个只能接受引用类型的泛型方法:
cs 复制代码
void ProcessReferenceType<T>(T obj) where T : class
{
    // 这里可以安全地假设T是一个引用类型
}
  • 值类型约束(struct):要求泛型类型参数必须是值类型,如枚举、结构体等。示例如下:
cs 复制代码
void ProcessValueType<T>(T value) where T : struct
{
    // 这里可以安全地假设T是一个值类型
}
  • 无参数构造函数约束(new ()) :规定泛型类型参数必须具有无参数的公共构造函数,这样在泛型代码中可以使用 new 关键字来创建类型参数的实例。例如:
cs 复制代码
T CreateInstance<T>() where T : new()
{
    return new T();
}
  • 基类约束 :指定泛型类型参数必须是指定基类或其子类。比如,有一个基类 BaseClass,可以这样约束泛型类型参数:
cs 复制代码
void ProcessBaseClass<T>(T obj) where T : BaseClass
{
    // 这里可以安全地假设T是BaseClass或其子类
}
  • 接口约束 :表示泛型类型参数必须实现指定的接口。例如,定义一个泛型方法,要求类型参数实现 IComparable 接口:
cs 复制代码
void CompareObjects<T>(T obj1, T obj2) where T : IComparable<T>
{
    // 这里可以安全地假设T实现了IComparable<T>接口
}

次要约束

  • 泛型类型参数约束 :一个泛型类型参数可以基于另一个泛型类型参数进行约束。例如,定义两个泛型类型参数 TU,要求 UT 的子类或实现了 T 接口:
cs 复制代码
void ProcessGenericTypes<T, U>(T obj1, U obj2) where U : T
{
    // 这里可以安全地假设U是T的子类或实现了T接口
}
  • 裸类型约束:在泛型类型参数列表中,可以使用裸类型作为约束。裸类型约束允许你指定泛型类型参数必须是某个具体类型或其子类型。例如:
cs 复制代码
class MyGenericClass<T> where T : MyBaseClass
{
    // 这里的T必须是MyBaseClass或其子类
}
相关推荐
小大宇22 分钟前
python flask框架 SSE流式返回、跨域、报错
开发语言·python·flask
柒星栈1 小时前
PHP 源码怎么加密防破解?三套方案实战指南
开发语言·php·android studio
Duo1J1 小时前
【UE】Slate 编辑器工具开发03 - 节点编辑器 (EdGraph)
ue5·编辑器·游戏引擎·ue4
勉灬之1 小时前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript
我叫黑大帅1 小时前
我为什么单一消费者的场景下,要用 Redis List 当消息队列?
redis·后端·面试
吃饱了得干活2 小时前
亿级订单表分库分表设计,从0到1全流程
java·数据库·面试
这是个栗子2 小时前
前端开发中的常用工具函数(九)
开发语言·javascript·ecmascript·at
蓝创工坊Blue Foundry2 小时前
图片文字提取到 Excel:批量任务如何先定义要交付的字段
运维·服务器·开发语言·数据库·自动化·ocr·excel
会飞的小新2 小时前
C 标准库之 <fenv.h> 详解与深度解析
c语言·开发语言·microsoft
郝学胜-神的一滴2 小时前
[简化版 GAMES 104] 现代游戏引擎 02:拆解现代游戏引擎5+1层级架构,吃透引擎底层核心逻辑
c++·unity·架构·游戏引擎·图形渲染·unreal engine·系统设计