1,类型对象,对于应用程序的各种类型创建的对象叫做类型对象:Type object;对于泛型类型参数的类型,CLR同样也会创建内部类型对象,适用于

  • 引用类型
  • 值类型
  • 接口类型
  • 委托类型

具有泛型类型参数的类型称为:开放类型。

指定了泛型实参的类型称为:封闭类型。比如 Dictionary<TKey,TVale>称为开放类型,Dictionary<string,int>称为封闭类型

2,委托和接口泛型的逆变和协变。

  •  Func<object, ArgumentException> fn1 = (x) => { Console.WriteLine(x); return null; };
    Func<string, Exception> fn2 = fn1;
    Exception e = fn2("x");
    Console.ReadKey();

    当一个委托或者一个接口类型,其泛型参数前面带in时,则允许接受该参数为其派生类的委托的实列。

  • 当一个委托或者一个接口类型,其泛型参数前面带out时,则允许接受该参数为其基类的委托的实列。比如上面。
  • string 是 object 的派生类,Exception 是 ArgumentException 的基类。所以可以赋值。

3,泛型的约束

  public static T Min<T>(T o1,T o2 ) where T : IComparable<T>
{
if (o1.CompareTo(o2) < 0) return o1;
return o2;
}
public static void CallMin()
{
object o1 = "jeff", o2 = "Richter";
object oMin = MinType.Min<string>((string)o1, (string)o2);
}

利用约束,则在泛型函数内部可以使用约束特有的性质

  • 类型参数,可以指定0个或者多个主要约束,组要约束不可以是,Object,Array,Delegate,ValueType,Enum,Void
  • 特殊的类型:class--表明是引用类型,则可以赋值 null;struct---值类型,支持default(T);支持 new T();
  • 特殊的类型:new()---则支持 new()操作构造器约束
  • private static List<TBase> ConvertIList<T, TBase>(IList<T> list) where T : TBase
    {
    List<TBase> baseList = new List<TBase>(list.Count);
    for (int index = 0; index < list.Count; index++)
    {
    baseList.Add(list[index]);
    }
    return baseList;
    }
    public static void CallingConvertIList()
    {
    IList<String> ls = new List<string>();
    ls.Add("a string");
    //1,将IList<string> 转换为 IList<Object>
    IList<object> l1 = ConvertIList<string, object>(ls);
    //2,将Ilist<string>转换为IList<IComparable>
    IList<IComparable> l2 = ConvertIList<string, IComparable>(ls);
    //3,将Ilist<string>转换为IList<Exception>
    IList<Exception> l3 = ConvertIList<string, Exception>(ls);
    }

l3的时候,失败,应为不能进行类型的转换。

4,泛型变量的类型引用

//方法1:
private void Cast<T>(T obj)
{
int x =(int)obj;//错误,不允许
int x =(int)(object)obj//允许,但是可能会在运行时报错
string x= obj as string;//允许,在引用类型时候 }

5,将泛型类型变量设为默认值,如果是7引用类型,则设为null,如果是值类型,则设为0.

T temp = default(T);

6,将泛型类型和null进行比较。允许,但是当T约束为struct时,不允许。

7,比较操作==,!= 非法,必须约束为引用类型。因为引用类型的比较时合法的,但是值类型的比较是非法的,除非其重载了==操作符。

clr via c# 泛型的更多相关文章

  1. CLR VIA C# 泛型的协变和逆变

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. CLR via C#深解笔记六 - 泛型

    面向对象编程一个好处就是“代码重用”,极大提高了开发效率.如是,可以派生出一个类,让它继承基类的所有能力,派生类只需要重写虚方法,或添加一些新的方法,就可以定制派生类的行为,使之满足开发人员的需求. ...

  3. [CLR via C#]12. 泛型

    泛型(generic)是CLR和编程语言提供一种特殊机制,它支持另一种形式的代码重用,即"算法重用". 简单地说,开发人员先定义好一个算法,比如排序.搜索.交换等.但是定义算法的开 ...

  4. CLR类型设计之泛型(一)

    在讨论泛型之前,我们先讨论一下在没有泛型的世界里,如果我们想要创建一个独立于被包含类型的类和方法,我们需要定义objece类型,但是使用object就要面对装箱和拆箱的操作,装箱和拆箱会很损耗性能,我 ...

  5. CLR via C#关于泛型(Generics )的摘录

    泛型,是CLR和编程语言提供的一种特殊机制,它支持另一种形式的代码重用,即“算法重用”. 简单的说,开发人员先定义好一个算法,比如排序.搜索.交换.比较或者转换等.但是,定义算法的开发人员并不设改算法 ...

  6. 《CLR via C#》读书笔记 之 泛型

    第十二章 泛型 2014-06-15 初始泛型 12.3 泛型基础结构 12.3.1 开放类型与封闭类型 12.3.2 泛型类型和继承 12.3.3 泛型类型同一性 12.3.4 代码爆炸 12.6 ...

  7. 重温CLR(八 ) 泛型

    熟悉面向对象编程的开发人员都深谙面向对象的好处,其中一个好处是代码重用,它极大提高了开发效率.也就是说,可以派生出一个类,让他继承基类的所有能力.派生类只需要重写虚方法,或添加一些新方法,就可定制派生 ...

  8. 泛型(Generics)

    Framework类库中的泛型 泛型可以使代码重用,提高开发效率 CLR允许在引用类型.值类型或接口中定义泛型方法: CLR允许创建泛型引用类型.泛型值类型(枚举不允许创建).泛型委托类型和泛型接口类 ...

  9. CLR总览

    Contents 第1章CLR的执行模型... 4 1.1将源代码编译成托管代码模块... 4 1.2 将托管模块合并成程序集... 6 1.3加载公共语言运行时... 7 1.4执行程序集的代码.. ...

随机推荐

  1. UIKit, AppKit, 以及其他API在多线程当中的使用注意事项

    UIKit, AppKit, 以及其他API在多线程当中的使用注意事项 Overview The Main Thread Checker is a standalone tool for Swift ...

  2. 团队项目——Beta冲刺

    团队项目-Beta冲刺 作业所属课程 软件工程 作业要求 团队项目-Beta冲刺 团队名称 运气王团队 作业目标 (1)SCRUM部分(2)PM 报告 成员列表: 1.团队成员的学号列表 |何宸锐(组 ...

  3. linux系统iot平台编程阶段总结

    1.inline内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 在使用循 ...

  4. Matplotlib API汉化 Pyplot API

    https://www.cnblogs.com/chenxygx/p/9554443.html

  5. C#系列之基础知识点(一)

    知识点一:VS启动方法 第一种:双击图标 第二种:window+R——调出cmd,输入devenu properties  属性的意思 知识点二:后缀名解释 .sln  解决方案文件:包含整个解决方案 ...

  6. 最大连续和(dp复习)

    最大连续和:给出一段序列,选出其中连续且非空的一段使得这段和最大. stdin: 7 2 -4 3 -1 2 -4 3 stdout: 4 状态转移方程:dp[i]=max(dp[i-1]+a[i], ...

  7. Codeforces_828

    A.模拟,注意单人的时候判断顺序. #include<bits/stdc++.h> using namespace std; int n,a,b; int main() { ios::sy ...

  8. java13人机猜拳

    public class Demo01 { public static void main(String[] args) { /* * 你同桌和你要玩游戏. * 1 剪刀,2 石头,3 布 */ // ...

  9. mongodb副本集群搭建

    一.环境介绍 1.机器信息 10.40.6.68 10.40.6.108 10.40.6.110 软件环境为centos 6.x 2.mongodb 下载链接地址 https://www.mongod ...

  10. RabbitMQ安装与使用

    官网地址: http://www.rabbitmq.com/ 安装Linux必要依赖包 下载RabbitMQ必须安装包 进行安装,修改相关配置文件即可 步骤 1.准备: yum install gcc ...