展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > C# 泛型约束详解:where关键字高级用法

C# 泛型约束详解:where关键字高级用法

泛型约束(where子句)是编译期类型安全的关键机制,用于限定泛型参数可接受的类型,支持成员访问、实例化及协变/逆变等操作,共六类:class/struct、基类/接口、new()、in/out、组合约束及泛型参数约束。

本文目录

    泛型约束(where子句)是编译期类型安全的关键机制,用于限定泛型参数可接受的类型,支持成员访问、实例化及协变/逆变等操作,共六类:class/struct、基类/接口、new()、in/out、组合约束及泛型参数约束。

    C# 泛型(Generics)的约束有哪些 - where关键字的高级用法

    泛型约束的核心作用

    泛型约束(where子句)不是可选项,而是让编译器在编译期就验证类型安全的关键机制。它限制了泛型参数能接受哪些具体类型,从而允许你在泛型代码中调用这些类型支持的操作——比如调用方法、访问属性、使用 new() 创建实例,或者进行特定的类型转换。

    六类常见 where 约束及其典型用途

    class / struct:限定引用类型或值类型

    • where T : class —— 确保 T 是类、接口、委托或数组(即非值类型),可用于判空或作为引用传递
    • where T : struct —— 确保 T 是不可为 null 的值类型(不含 Nullable),常用于高性能数值计算场景

    基类或接口约束:启用成员访问

    • where T : IComparable —— 可直接调用 CompareTo()
    • where T : Animal, ICloneable —— 支持多约束,T 必须继承 Animal 并实现 ICloneable
    • 注意:基类必须写在接口前面,且只能有一个基类

    构造函数约束:new()

    • where T : new() —— 要求 T 具有无参公共构造函数
    • 常与其它约束组合使用,例如 where T : class, new(),适用于工厂模式或 ORM 实体创建
    • 不支持带参构造函数;若需更灵活初始化,应改用工厂委托或抽象工厂

    协变与逆变约束(仅适用于泛型接口/委托)