定义泛型类

创建泛型类,在类定义中包含尖括号语法

class MyGenericClass<T>

{

...

}

T可以是任意标识符,只要遵循通常的C#命名规则即可。泛型类可以在其定义中包含多个类型,用逗号分隔开

class MyGenericClass<T1, T2, T3>

{

...
}

定义了这些类型后,就可以在类定义中像使用其他类型那样使用它们。

如果把构造函数改为 innerT1Object = new T1();编译会出错,因为当前不知道T1是什么,也不能使用它的构造函数,甚至可能没有构造函数。

default关键字

如果像这样赋值innerT1Object = null;编译会出错,因为此时不知道此类型是值类型还是引用类型那么可以用default关键字解决这个问题。

innerT1Object = default(T1) 如果innerT1Object是引用类型,就给它赋予null值,如果它是值类型,就给它赋予相应的默认值。

约束类型

前面用于泛型类的类型称为无绑定类型,因为没有对它们进行任何约束。而通过约束类型,可以限制可用于实例化泛型类的类型。可以把类型限制为继承自某个类型。

在类定义中,可以使用where关键字来实现。

class MyGenericClass<T1, T2>: MyBaseClass, IMyInterface

where T1 : constraint1 where T2 : constraint2

{

...

}

如果new() (类型必须有一个公共的无参构造函数)用作约束,它就必须是为类型指定的最后一个约束。

可以通过base-class约束,把一个类型参数用作另一个类型参数约束。

class MyGenericClass<T1, T2> where T2 : T1

{

...

}

T2必须与类型T1的类型相同,或者继承自T1。这称之为裸类型约束。类型约束不能循环。

C# - Generic的更多相关文章

  1. C#:泛型(Generic)

    前言:  此系列都为个人对C#的回顾,属于个人理解,新司机可参考.求老司机指点.如果有什么问题或不同见解,欢迎大家与我沟通! 目录:  泛型是什么 泛型的好处及用途 如何声明使用泛型 泛型类 泛型方法 ...

  2. Target runtime com.genuitec.runtime.generic.jee60 is not defined

    转载自:http://jingyan.baidu.com/article/d7130635338e3f13fdf47518.html 用eclipse加载别人的工程,报错Target runtime ...

  3. A library of generic data structures

    A library of generic data structures including a list, array, hashtable, deque etc.. https://github. ...

  4. System.Collections.Generic的各容器类的用法

    演示System.Collections.Generic的各容器类的用法. 包括:Dictionary,KeyValuePair,SortedDic tionary,SortedList,HashSe ...

  5. Runtime Complexity of .NET Generic Collection

    Runtime Complexity of .NET Generic Collection   I had to implement some data structures for my compu ...

  6. 泛型(Generic)

    本质:限制集合类型 我们在编写泛化类的时候,我们要时刻提醒自己,我们传入的参数T仅仅是一个Object类型,任何具体类型信息我们都是未知的. 小例子: package day02.generic; i ...

  7. 使用用Generic.xaml加载默认的主题资源

    把Resource嵌入到Generic.xaml文件中,并把该文件放到应用程序的Themes主题文件夹下面,这们Generic.xaml文件中的资源就可以被系统识别为默认主题一部分,从而进行使用. 为 ...

  8. 1.2 基础知识——关于猪皮(GP,Generic Practice)

    摘要: 这是<CMMI快乐之旅>系列文章之一.说起猪皮(GP,Generic Practice),真的让人又爱又恨,中文翻译叫通用实践.CMMI标准中每个级别包含几个PA,每个PA又包含几 ...

  9. Debian 8.2 下安装MySQL5.7.9 Generic Binaries

    安装过程参考了Installing MySQL on Unix/Linux Using Generic Binaries 首先检查是否安装libaio shell> apt-cache sear ...

  10. NHibernate无法将类型“System.Collections.Generic.IList<T>”隐式转换为“System.Collections.Generic.IList<IT>

    API有一个需要实现的抽象方法: public IList<IPermission> GetPermissions(); 需要注意的是IList<IPermission>这个泛 ...

随机推荐

  1. 插入到Mysql数据库中的汉字乱码

    出现这个问题,大都是在Mysql安装的时候没有选择成UTF8,默认安装的话应该是latin编码 安装完成之后后期可以在配置文件中修改. 打开Mysq的安装位置,查看my.ini文件. 修改如下设置编码 ...

  2. scikit-learn点滴

    scikit-learn点滴 scikit-learn是非常漂亮的一个机器学习库,在某些时候,使用这些库能够大量的节省你的时间,至少,我们用Python,应该是很难写出速度快如斯的代码的. sciki ...

  3. Jquery 全选、反选问题解析

    最近工作中,需要使用Jquery实现复选框的全选和反选,本人虽然不是专职撸前端的,但这个小问题感觉也没什么难度,下面直接上代码: <div id="list"> < ...

  4. (转)linuxmint,ubuntu 下修改guake宽度方法

    之前在网上找到修改guake.py的方式,但是我一直没能找到guake.py的文件,弄的我纠结,后来找到这个文章,这个确实是有效果的 Ubuntu12.04上Guake在唤出的时候滚动条会消失,主要原 ...

  5. nodejs3-事件zepto.js事件

    Event代表事件名,listener代表事件处理函数,括号内的参数代表可选参数: addListener(event,listener):对指定事件绑定事件处理函数 on(同上):addListen ...

  6. Jersey(1.19.1) - Life-cycle of Root Resource Classes

    By default the life-cycle of root resource classes is per-request, namely that a new instance of a r ...

  7. 【转载】Apache Kafka:下一代分布式消息系统

    http://www.infoq.com/cn/articles/kafka-analysis-part-1 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩 ...

  8. MYfirst

    终于有了自己的博客了,啊哈哈!

  9. Android之线程终止

    Hanlder是线程与Activity通信的桥梁,利用handler接收到任务线程,放到任务队列里面派对执行. 1.初始化的时候,定义启动的线程为一个守护线程,这样当主线程消亡掉的时候,其他线程也会被 ...

  10. 北大ACM(POJ1753-Flip Game)

    Question:http://poj.org/problem?id=1753 问题点:穷举. #include <iostream> using namespace std; ][];/ ...