当我出于实验目的编写以下代码片段时,它引发了悬停错误(请参见屏幕截图):
片段:
dynamic* pointerToDynamic = &fields;
虽然显然不允许使用该代码(您不能使用托管类型的地址),但它向我提出了一个问题:非托管类型是什么,它与托管类型有什么不同?还是只是Visual Studio试图变得有趣?
最佳答案
非托管和非托管指针之间有区别。
托管指针是托管堆上对象的句柄,并且AFAIK仅在托管C++中可用。它等效于对对象的C#引用。另一方面,非托管指针等效于传统的C样式指针,即存储位置的地址; C#为此提供了一元&
运算符,fixed
关键字和unsafe
上下文。
您试图获取一个指向托管字段的指针(dynamic
实际上是System.Object
的伪装),而C#仅允许指向非托管对象的指针,因此措辞为:您的类型为非非托管对象。
有关此here的更多信息。
更新:为了使其更加清晰,托管C++支持经典的C风格的指针和引用。但是为了保持C++术语的一致性,它们分别称为非托管和托管指针。 C#还支持指针(在unsafe
上下文中明确地)和引用(在涉及引用类型的对象时隐式),但是后者是而非,称为“托管指针”,它们只是引用。
总结一下:在C++中有非托管和托管指针,在C#中-非托管指针和引用。
希望现在有意义。