非非托管类型和托管类型之间有什么区别?

当我为实验目的编写以下代码段时,它引发了hover错误(参见屏幕截图):

无法声明指向非非托管类型的’动态’

片段:

dynamic* pointerToDynamic = &fields; 

虽然代码显然不被允许(你不能获取托管类型的地址),但它提出了一个问题:什么是非非托管类型 ,它与托管类型有什么不同? 或者只是Visual Studio试图变得有趣?

在此处输入图像描述

非托管指针和非托管指针之间存在差异。

托管指针是托管堆上对象的句柄,AFAIK仅在托管C ++中可用。 它等同于对象的C# 引用 。 另一方面,非托管指针等同于传统的C风格指针,即内存位置的地址; C#为此提供一元&运算符, fixed关键字和unsafe上下文。

您正在尝试获取指向托管字段的指针( dynamic实际上是System.Object伪装),而C#仅允许指向非托管对象的指针,因此措辞:您的类型是非托管的。

在这里再说一点 。

更新:为了使其更清晰,托管C ++支持经典的C风格指针引用 。 但是为了保持C ++术语的一致性,相应地将它们称为非托管托管 指针 。 C#还支持指针(显式地在unsafe上下文中)和引用(隐含地涉及引用类型的对象),但后者称为“托管指针”,它们只是引用。

总结一下:在C ++中有非托管和托管指针,在C#中是非托管指针和引用。

希望现在有意义。

您无法创建指向托管类型的指针。 虽然管理int,double等,但它们具有非托管对应物。

那么非非托管类型真正意味着托管类型

这里的问题是托管类型因为坐在堆上,你无法获得指针。 您可以使用固定关键字获取指针,但主要用于数组。