有没有办法将CLR类型的指针分配给C#void*
块中的unsafe
?
var bar = 1;
var foo = new Foo();
unsafe
{
void* p1 = &bar;
void* p2 = &foo; // fails at compile time
}
或者这只能使用C ++ / CLI:
System::Text::StringBuilder^ sb = gcnew System::Text::StringBuilder();
void* p1 = &sb;
找不到任何方法让它在C#中起作用
答案 0 :(得分:3)
根据MSDN documentation:
以下任何类型都可能是a 指针类型:
- sbyte,byte,short,ushort,int,uint,long,ulong,char,float,
double,decimal或bool。- 任何枚举类型。
- 任何指针类型。
- 包含非托管类型字段的任何用户定义的结构类型 仅
没有办法指向类的实例(例如指向System.Text.StringBuilder
实例的指针),尽管你可以在fixed
上下文中有一个指向类成员的指针,如在以下代码中:
class Test
{
static int x;
int y;
unsafe static void F(int* p) {
*p = 1;
}
static void Main() {
Test t = new Test();
int[] a = new int[10];
unsafe {
fixed (int* p = &x) F(p);
fixed (int* p = &t.y) F(p); // pointer to a member of a class
fixed (int* p = &a[0]) F(p);
fixed (int* p = a) F(p);
}
}
}
答案 1 :(得分:2)
要获取指向托管对象的指针,它必须是fixed
,以便GC知道不要移动对象。