Назначение указателя на тип CLR для void * с использованием unsafe? - PullRequest
2 голосов
/ 02 февраля 2010

Можно ли назначить указатель на тип CLR для void* в блоке C # 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 #

Ответы [ 2 ]

3 голосов
/ 02 февраля 2010

Согласно документации MSDN :

Любой из следующих типов может быть тип указателя:

  • 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);
    }
}
}
2 голосов
/ 02 февраля 2010

Чтобы получить указатель на управляемый объект, он должен быть fixed, чтобы GC знал, что объект нельзя перемещать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...