当我为实验目的编写以下代码段时,它引发了悬停错误(请参见屏幕截图):
无法声明指向非非托管类型'dynamic'的指针
摘录:
dynamic* pointerToDynamic = &fields;
虽然代码显然不被允许(您无法获取托管类型的地址),但它提出了一个问题:非非托管类型是什么?它与托管类型?或者只是Visual Studio试图变得有趣?
答案 0 :(得分:7)
非托管和非托管指针之间存在差异。
托管指针是托管堆上对象的句柄,AFAIK仅在托管C ++中可用。它等同于对象的C#引用。另一方面,非托管指针等同于传统的C风格指针,即存储器位置的地址; C#为此提供了一元&
运算符,fixed
关键字和unsafe
上下文。
您正在尝试获取指向托管字段的指针(dynamic
实际上System.Object
是伪装的),而C#只允许指向非托管对象的指针,因此措辞:您的类型是非托管的
关于here的更多内容。
更新:为了使其更加清晰,托管C ++支持经典的C风格的指针和引用。但为了保持C ++术语的一致性,它们相应地称为非托管和托管 指针。 C#还支持指针(显式位于unsafe
上下文中)和引用(隐含地涉及引用类型的对象),但后者是不称为“托管指针”,它们只是引用。
总结一下:在C ++中,有非托管和托管指针,在C#中是非托管指针和引用。
希望现在有意义。
答案 1 :(得分:2)
您无法创建指向托管类型的指针。虽然管理int,double等,但它们具有非托管对应物。
那么非非托管类型的真正含义是托管类型。
这里的问题是托管类型因为坐在堆上,你无法获得指针。您可以使用 fixed 关键字获取指针,但主要用于数组。