c# in depth之泛型的类型约束详细
类型约束
1.引用类型约束
这种约束(表示成T:class,必须是为类型参数指定的第一个约束)用于确保使用的类型实参是引用类型,这可能是任何类,接口,数组,委托或者已知是引用类型的另一个类型参数。
例如 struct RefSample<T> where T:class
有效的封装类型包括:
RefSample<IDisposable>;
RefSample<string>;
RefSample<int[]>;
无效的封装类型包括:
RefSample<Guid>
RefSample<int>
2.值类型约束
这种约束(表示成T:struct)可以确保使用的类型实参是值类型,其中包括枚举。但是,它将可空类型排除在外。
例如 class ValSample<T> where T:struct
有效的封装类型包括:
ValSample<int>
ValSample<FileMode>
无效的封装类型包括:
ValSample<object>
ValSample<string>
3.构造函数类型约束
这种约束(表示为T:new(),必须是所有类型参数的最后一个约束)仅核对所有类型实参有一个无参的构造函数,这个构造函数可用于创建类型的实例。这适用于:所有的值类型;所有非静态、非抽象、没有显示声明的构造函数的类;显示声明了一个公开的无参构造函数的所有非抽象类。
例子:
public T CreateInstance<T>() where T:new()
{
return new T();
}
有效的实例包括
CreateInstance<int>()
CreateInstance<object>()
无效的实例
CreateInstance<string>()
因为string没有无参构造函数
没有办法规定类型参数必须具备其他构造函数的签名,例如不能指定类型参数必须拥有一个以单个字符串作为参数的构造函数。
4.转换类型约束
这种约束允许你指定另一个类型,类型实参必须可以通过一致性引用或者装箱转换隐式地转换为该类型。还可以规定一个类型实参必须可以转换为另一个类型实参,这称为类型参数约束。
例子
class Sample<T> where T:Stream
有效:Sample<Stream> (一致性转换)
无效:Sample<string>
class Sample<T> where T:IDisposable
有效:Sample<SqlConnection>(引用转换)
无效:Sample<StringBuilder>
class Sample<T> where T:IComparable<T>
有效:Sample<int> (装箱转换)
无效:Sample<FileInfo>
class Sample<T,U> where T:U
有效:Sample<Stream,IDisposable>
无效:Sample<string,IDisposable>
任何类型都不能直接派生自多个类。对于这样的约束,要么是永远无法满足的,要么它的一部分是多余的。
5.组合约束
没有任何类型既是值类型又是引用类型。所以像这样的组合是禁止的。另外,由于每一个值类型都有一个无参构造函数,所以假如已经有一个值类型约束,就不允许再指定一个构造函数约束。如果存在多个转换类型约束,并且其中一个为类,那么它应该出现在接口的前面,而且我们不能多次指定同一个接口。不同的类型参数可以有不同的约束,它们分别由一个单独的where引入
有效的例子
class Sample<T> where T:class,IDisposale,new()
class Sample<T> where T:struct,IDisposable
class Sample<T> where T:class where U:struct,T
class Sample<T> where T:Stream where U:IDisposable
无效的例子
class Sample<T> where T:class,struct
class Sample<T> where T:Stream,class
class Sample<T> where T:new(),Stream
class Sample<T> where T:IDisposable,Stream
class Sample<T> where T:XmlReader,IComparable,IComparable
class Sample<T> where T:struct where U:class,T
class Sample<T> Stream,U:IDisposable
本文整理自:c# in depth
IDisposable接口用法请参阅:
http://blog.sina.com.cn/s/blog_66998b3f0100vwkn.html
c# in depth之泛型的类型约束详细的更多相关文章
- swift 泛型的类型约束
总结: 1.类型约束只能添加到泛型参量上面 2.关联类型是泛型参量: 3.关联类型可以通过 协议.关联类型名称的形式引用: func allItemsMatch<C1: Container, C ...
- Scala 基础(十六):泛型、类型约束-上界(Upper Bounds)/下界(lower bounds)、视图界定(View bounds)、上下文界定(Context bounds)、协变、逆变和不变
1 泛型 1)如果我们要求函数的参数可以接受任意类型.可以使用泛型,这个类型可以代表任意的数据类型. 2)例如 List,在创建 List 时,可以传入整型.字符串.浮点数等等任意类型.那是因为 Li ...
- 编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]
前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托 ...
- [转] C# 泛型类型参数的约束
啊.紫原文C# 泛型类型参数的约束 在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制.如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误.这些限制 ...
- JavaBean 内省API BeanUtils工具 泛型 xml xml约束
1 什么是JavaBean?有何特征? 1)符合特定规则的类 2)JavaBean分二类: a)侠义的JavaBean .私有的字段(Field) .对私 ...
- 转载c#泛型 类型参数的约束(c#编程指南)
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制.如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误.这些限制称为约束.约束是使用 where 上 ...
- swift的类型约束
关键词: 类型与功能绑定.类型指定.访问控制. 类型约束的本质: 1.是否强制指定具有某些特征的类型:看类型构造器的定义本身是否对类型有约束: 2.访问控制:类型构造器的功能分为通用功能和约束功能: ...
- C#泛型类的类型约束
是使用泛型时,T默认情况下是不可以被初始化的,只能通过传值来赋值,这个时候可以使用类型约束来保证T是可以被约束的. .NET支持的类型参数约束有以下五种: where T: struct //T必须是 ...
- C# 泛型类型参数的约束
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制.如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误.这些限制称为约束.约束是使用 where 上 ...
随机推荐
- 为什么要用BASE64
BASE64和其他相似的编码算法通常用于转换二进制数据为文本数据,其目的是为了简化存储或传输.更具体地说,BASE64算法主要用于转换二进 制数据为ASCII字符串格式.Java语言提供了一个非常好的 ...
- 基于visual Studio2013解决C语言竞赛题之0505选数
题目
- OnPaint()函数的作用原理
WM_PAINT是窗口每次重绘都会产生的一个消息. OnPaint是对这个消息的反应函数 mfc 的 CWnd::OnPaint 没做什么,只是丢给系统处理. 一 : 先执行OnEraseBkgnd, ...
- C++逗号运算符与逗号表达式
C++将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句.循环语句等)中.这是C++语言灵活性的一种表现. 请注意,用cout语句输出一个 ...
- typedef 总结
其实在正儿八经学C语言的时候typedef用的不是很多,记得书上对它的介绍只是一笔带过.的确它的用法是很简单,但这不代表在使用的过程中不会出错,今天来个彻底的总结. 作用:用来建立新的数据类型名.(注 ...
- 15-UIKit(view布局、Autoresizing)
目录: 1. 纯代码布局 2. 在View中进行代码布局 3. Autoresizing 回到顶部 1. 纯代码布局 纯代码布局分VC下和V下 [MX1-layout-code] 在VC下覆盖view ...
- ubuntu 12.04 安装sublime2
add-apt-repository ppa:webupd8team/sublime-text-2 apt-get update apt-get install sublime-text 安装控制器: ...
- 教你在mac上配置adb环境变量
1.打开终端,一次输入如下命令 cd ~ touch .bash_profile open -e .bash_profile 2.这时候会在TextEdit中打开一个空白文档,输入下面的语句 a. 输 ...
- hdu 1282回文数猜想
http://acm.hdu.edu.cn/showproblem.php?pid=1282 Problem Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序 ...
- perl 处理文本
redis01:/root# cat abc GET /api/sale/get_voucher_list?loupan_id=32300&suid=kJIjl&loupan_site ...