当我写下以下代码段用于实验目的时,它引发了悬停错误(见截图):
无法声明指向非托管类型“dynamic”的指针
代码段:
dynamic* pointerToDynamic = &fields;
虽然这段代码明显是不允许的(你不能取得托管类型的地址),但它引发了一个问题:什么是非非托管类型,它与托管类型有何不同?或者这只是Visual Studio想要逗我们笑吗?
当我写下以下代码段用于实验目的时,它引发了悬停错误(见截图):
无法声明指向非托管类型“dynamic”的指针
代码段:
dynamic* pointerToDynamic = &fields;
虽然这段代码明显是不允许的(你不能取得托管类型的地址),但它引发了一个问题:什么是非非托管类型,它与托管类型有何不同?或者这只是Visual Studio想要逗我们笑吗?
非托管指针和未管理指针是不同的。
受控制的 指针 是一个到托管堆上对象的句柄,在托管 C++ 中可用。它相当于 C# 对象的 引用。另一方面,未管理指针相当于传统的 C 风格指针,即内存位置的地址;C# 提供了一元 &
运算符、fixed
关键字和 unsafe
上下文来实现它。
您正在尝试获取到托管字段的指针(dynamic
实际上是伪装成的 System.Object
),而 C# 只允许指向非托管对象的指针,因此使用“non-unmanaged”这样的词语。
更多相关信息请参考这里。
更新:为了更加清晰,托管 C++ 支持经典的 C 风格 指针 和 引用。但是为了保持 C++ 术语的一致性,它们分别被称为 未管理 和 托管 指针。C# 也支持指针(在 unsafe
上下文中明确支持)和引用(每当参与引用类型对象时隐式支持),但后者不称为“托管指针”,它们只是引用。
总之:在 C++ 中有未管理和托管指针,在 C# 中有未管理指针和引用。
希望现在能更加清楚。
您无法创建指向托管类型的指针。虽然int、double等是托管类型,但它们有非托管对应项。
因此,“非非托管类型”实际上是指“托管类型”。
问题在于,由于托管类型位于堆上,您无法获取指向其的指针。您可以使用fixed关键字获取指针,但这主要用于数组。