通用类型的指针

时间:2015-06-05 21:29:38

标签: c# pointers generics

为什么在C#中使用泛型类型的指针无效? int?*无效,而typeof(int?).MakePointerType()不会产生异常。

根据MSDN,指针可以是:

  

sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool。

     

任何枚举类型。

     

任何指针类型。

     

任何用户定义的结构类型,仅包含非托管类型的字段。

我没有看到与仿制品有关的任何限制。 int?看起来有效,因为它只包含boolint字段。

1 个答案:

答案 0 :(得分:7)

引用C#5.0规范§18.2指针类型

  

与引用(引用类型的值)不同,指针不是   由垃圾收集器跟踪 - 垃圾收集器没有   知识指针和他们指向的数据。为了这   因为不允许指针指向引用或指向   包含引用的结构,以及指针的引用类型   必须是非托管类型。

     

非托管类型是任何非类型的类型   引用类型或构造类型,并且不包含引用类型   或者在任何嵌套级别构造类型字段。换句话说,一个   unmanaged-type是以下之一:

     
      
  • sbyte,byte,short,ushort,   int,uint,long,ulong,char,float,double,decimal或bool。
  •   
  • 任何   枚举类型。
  •   
  • 任何指针类型。
  •   
  • 任何用户定义的struct-type   不是构造类型,只包含非托管类型的字段。
  •   

阻止你的关键部分是constructed type限制。

来自§1.6.3类型参数(强调我的)

  

提供类型参数的泛型类型,如上面的Pair<int,string>称为构造类型

您指定类型参数的任何泛型类型都被视为构造类型,并且不允许构造类型位于指针中。这就是为什么Nullable<int>不被允许的原因。