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
posted on 2013-11-11 00:44 huakaiyueluo 阅读(419) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程