为什么在C#中使用泛型类型的指针无效? int?*
无效,而typeof(int?).MakePointerType()
不会产生异常。
根据MSDN,指针可以是:
sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool。
任何枚举类型。
任何指针类型。
任何用户定义的结构类型,仅包含非托管类型的字段。
我没有看到与仿制品有关的任何限制。 int?
看起来有效,因为它只包含bool
和int
字段。
答案 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>
不被允许的原因。