泛型内部机制
  泛型拥有类型参数,通过类型参数可以提供”参数化”的类型,事实上,泛型类型的”类型参数”变成了泛型类型的元数据,”运行时”在需要的时候会利用他们构造恰当的类型,通过这些类型,我们有可以实例化不同类型的对象。也是说,未绑定泛型类型是以构造泛型类型的蓝图,已构造泛型类型又是实际对象的蓝图。
  分析泛型IL代码
  下面看一个例子,在这个例子中定义了一个用于比较的泛型类和一个比较int的非泛型类:
  namespace GenericTest
  {
  class CompareUtil<T>where T:IComparable
  {
  public T ItemOne{get;set;}
  public T ItemTwo{get;set;}
  public CompareUtil(T itemOne,T itemTwo)
  {
  this.ItemOne=itemOne;
  this.ItemTwo=itemTwo;
  }
  public T GetBiggerOne()
  {
  if(ItemOne.CompareTo(ItemTwo)>0)
  {
  return ItemOne;
  }
  return ItemTwo;
  }
  }
  class IntCompareUtil
  {
  public int ItemOne{get;set;}
  public int ItemTwo{get;set;}
  public IntCompareUtil(int itemOne,int itemTwo)
  {
  this.ItemOne=itemOne;
  this.ItemTwo=itemTwo;
  }
  public int GetBiggerOne()
  {
  if(ItemOne.CompareTo(ItemTwo)>0)
  {
  return ItemOne;
  }
  return ItemTwo;
  }
  }
  class Program
  {
  static void Main(string[]args)
  {
  CompareUtil<int>compareInt=new CompareUtil<int>(3,6);
  int bigInt=compareInt.GetBiggerOne();
  IntCompareUtil intCompareUtil=new IntCompareUtil(4,7);
  int big=intCompareUtil.GetBiggerOne();
  Console.Read();
  }
  }
  }
  首先,通过ILSpy查看一下泛型类”CompareUtil<T>”的IL代码(只列出了一部分IL代码)
  .class private auto ansi beforefieldinit GenericTest.CompareUtil`1<([mscorlib]System.IComparable)T>
  extends[mscorlib]System.Object
  {
  ……
  .method public hidebysig specialname rtspecialname
  instance void.ctor(
  !T itemOne,
  !T itemTwo
  )cil managed
  {……}
  ……
  //Properties
  .property instance!T ItemOne()
  {
  .get instance!0 GenericTest.CompareUtil`1::get_ItemOne()
  .set instance void GenericTest.CompareUtil`1::set_ItemOne(!0)
  }
  .property instance!T ItemTwo()
  {
  .get instance!0 GenericTest.CompareUtil`1::get_ItemTwo()
  .set instance void GenericTest.CompareUtil`1::set_ItemTwo(!0)
  }
  }//end of class GenericTest.CompareUtil`1
  大家可以查看非泛型类”IntCompareUtil”的IL代码,你会发现泛型类的IL代码跟非泛型类的IL代码基本一致,只是泛型类的IL代码中多了一些类型参数元数据。