通用类型的指针

Ill*_*ack 5 c# generics pointers

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

根据MSDN,指针可以是:

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

任何枚举类型.

任何指针类型.

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

我没有看到任何与泛型有关的限制.int?看起来有效,因为它只包含一个boolint字段.

Sco*_*ain 8

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

与引用(引用类型的值)不同,垃圾收集器不跟踪指针 - 垃圾收集器不知道指针及它们指向的数据.因此,不允许指针指向引用或包含引用的结构,指针的引用类型必须是非托管类型.

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

  • 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>不允许的原因.