当前位置: 首页 > java >正文

关键字where

C# 中的 where 关键字主要用在泛型约束(Generic Constraints)中,目的是对泛型类型参数限制其必须满足的条件,从而保证类型参数具备特定的能力或特性,增强类型安全和代码可读性。

约束写法说明适用场景举例C#版本要求
where T : class类型参数必须是引用类型(类、接口、数组等)需要引用类型对象所有版本
where T : struct类型参数必须是非空值类型(结构体,不能是Nullable)需要值类型且非可空所有版本
where T : new()类型参数必须有公共无参构造函数需要用 new T() 创建实例所有版本
where T : BaseClass类型参数必须继承自指定基类需要基类的成员或行为所有版本
where T : IInterface类型参数必须实现指定接口需要接口定义的行为所有版本
where T : unmanaged类型参数必须是不含引用类型字段的非托管类型需要直接内存操作、指针操作C# 7.3 及以后
where T : System.Enum类型参数必须是枚举类型泛型操作枚举时C# 7.3 及以后
where T : System.Delegate类型参数必须是委托类型泛型委托相关操作C# 7.3 及以后

约束顺序规则

  1. 基类约束必须放在最前面(如果有)
    如果存在继承类的约束(如 where T : BaseClass),它必须写在所有接口约束之前。

  2. 接口约束写在基类约束后面
    可以有多个接口约束,写在基类约束之后,接口之间用逗号分隔。

  3. new() 构造函数约束必须写在最后
    表示类型参数必须有无参构造函数,必须放在所有其他约束的最后。

  4. class 和 struct 只能有一个,且不能和彼此同时使用

    • where T : class 表示引用类型约束
    • where T : struct 表示值类型约束
      两者互斥。
  5. class和BaseClass约束不能同时出现
  6. unmanaged 和其他值类型约束的结合
    unmanaged 约束比 struct 更严格,也只可单独使用。

约束类型书写顺序
基类约束、class约束、struct约束最前面
接口约束紧随基类约束后面
构造函数约束 (new())必须最后
classstruct与其他约束互斥,不可同时使用

Struct约束 

struct 约束的限制和组合规则

  • struct 约束不能与 class 约束同时出现(引用类型和值类型互斥)。

  • struct 约束不能与基类约束一起使用(因为基类必须是引用类型)。

  • struct 约束不能与接口约束一起使用(在早期C#版本中),但从C# 7.3 起允许和接口约束一起使用,即可以写:

    where T : struct, IComparable
  • struct 约束后面可以跟接口约束(C# 7.3及以后版本)。

  • struct 约束后面也可以跟构造函数约束 new(),不过对 struct 类型参数来说,编译器自动隐含有无参构造函数,new() 约束通常不必写。

合法示例: 

public class Example<T> where T : struct, IComparable, new()
{
}
http://www.xdnf.cn/news/4801.html

相关文章:

  • Docker学习笔记
  • deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_25
  • python小说网站管理系统-小说阅读系统
  • 什么是HTML、CSS 和 JavaScript?
  • 电容的基本介绍
  • WPF 子界面修改后通知到主页面
  • 嵌入式 C 语言控制语句
  • 44 Python MySQL(PyMySQL 驱动)
  • Java的对象头:原理与源码详解
  • python实现的音乐播放器
  • 企业生产安全管理平台的功能架构
  • Java后端程序员学习前端之JavaScript
  • PHP反序列化漏洞
  • CBO和HBO区别及介绍
  • 【包含例题P1955、P1892、P2024、P1196】并查集、扩展域并查集、带权并查集
  • arcmap栅格数据地理坐标转换,从WGS84坐标到2000
  • 深入理解Bitmap及Roaring Map:原理与应用详解
  • PPIO × GPT4All:构建本地知识库,让AI更懂你
  • 从单智到多智:深度拆解基于MetaGPT的智能体辩论
  • AI原生手机:三大技术阵营的终极对决与未来展望
  • 使用Maple Flow创建电路最坏情况分析WCCA工作表
  • 【前端】每日一道面试题2:解释CSS盒模型的box-sizing属性,以及它在响应式布局中的作用。
  • 字符串哈希(算法题)
  • VR 南锣鼓巷:古老街区的数字化绘卷与沉浸式遨游​
  • 高处安装、维护拆除作业考试重点知识
  • PlatformIO
  • 遗传算法求解异构车队VRPTW问题
  • 基于Credit的流量控制
  • SQL知识点总结
  • 【Yolo精读+实践+魔改系列】Yolov3论文超详细精讲(翻译+笔记)