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

c# 泛型类型参数T的约束where

在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。下表列出了六种类型的约束:

 
约束说明

T:结构

类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可空类型(C# 编程指南)。

T:类

类型参数必须是引用类型,包括任何类、接口、委托或数组类型。

T:new()

类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。

T:<基类名>

类型参数必须是指定的基类或派生自指定的基类。

T:<接口名称>

类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。

T:U

为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。

如果要检查泛型列表中的某个项以确定它是否有效,或者将它与其他某个项进行比较,则编译器必须在一定程度上保证它需要调用的运算符或方法将受到客户端代码可能指定的任何类型参数的支持。这种保证是通过对泛型类定义应用一个或多个约束获得的。例如,基类约束告诉编译器:仅此类型的对象或从此类型派生的对象才可用作类型参数。一旦编译器有了这个保证,它就能够允许在泛型类中调用该类型的方法。约束是使用上下文关键字 where 应用的。

 [转]

 

泛型约束基本上有五种:

  • 值类型约束:要求泛型参数必须是值类型,例如int,short以及自定义的stuct等
    public class MyClass2<T>          where T : struct//这个泛型类只接受值类型的泛型参数      {      }
  • 引用类型约束:要求泛型参数必须是引用类型,例如string,object,以及自定义的class
    public class MyClass<T>          where T:class//这个泛型类只接受引用类型的泛型参数      {      }
  • 构造函数约束:要求泛型参数必须有构造函数
    public class MyClass3<T>          where T : new()      {      }
  • 接口约束:要求泛型参数必须实现某个接口
    public class MyClass4<T>          where T : System.IComparable      {      }
  • 基类约束:要求泛型参数必须继承某个基类
    public class MyClass5<T>          where T : Customer      {      }

转载于:https://www.cnblogs.com/li--sa/archive/2013/05/07/3064721.html

相关文章:

  • 云如何让App开发更简单?
  • Common方法
  • 区块链概况:商业价值
  • 【水】tyvj1523 平面几何入门
  • web标准化(下)
  • Java环境搭建与配置
  • 【JS第17期】单体内置对象
  • Delphi编程地一些小程序
  • 乐观锁和悲观锁
  • Linux初始设置
  • PostgreSQL 11 preview - 分页内核层优化 - 索引扫描offset优化(使用vm文件skip heap scan)...
  • linux下jdb远程调试tomcat源码
  • PostgreSQL 11 preview - pgbench 支持大于1000链接(ppoll()代替select())
  • 数字操作符九度OJ 1019 简单计算器
  • NO1 ip-systemctl-fdisk
  • 【EOS】Cleos基础
  • 【node学习】协程
  • Javascript Math对象和Date对象常用方法详解
  • Java方法详解
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Vue2.0 实现互斥
  • 简单实现一个textarea自适应高度
  • 前端路由实现-history
  • 如何优雅地使用 Sublime Text
  • 通过git安装npm私有模块
  • 通过npm或yarn自动生成vue组件
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 移动端解决方案学习记录
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​520就是要宠粉,你的心头书我买单
  • (3)选择元素——(17)练习(Exercises)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)树状数组
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .Family_物联网
  • .NET Core 2.1路线图
  • .Net 应用中使用dot trace进行性能诊断
  • 。Net下Windows服务程序开发疑惑
  • @WebServiceClient注解,wsdlLocation 可配置
  • @我的前任是个极品 微博分析
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [Android]创建TabBar
  • [APIO2012] 派遣 dispatching
  • [BUUCTF 2018]Online Tool(特详解)
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [JS入门到进阶] 前端开发不能写undefined?这是误区!
  • [JS真好玩] 掘金创作者必备: 监控每天是谁取关了你?
  • [KMP求最小循环节][HDU1358][Period]