Почему я не могу использовать Marshal.Copy () для обновления структуры?

У меня есть код, предназначенный для получения структуры из байтового массива:

    public static T GetValue<T>(byte[] data, int start) where T : struct
    {
        T d = default(T);
        int elementsize = Marshal.SizeOf(typeof(T));

        GCHandle sh = GCHandle.Alloc(d, GCHandleType.Pinned);
        Marshal.Copy(data, start, sh.AddrOfPinnedObject(), elementsize);
        sh.Free();

        return d;
    }

Однако структура d никогда не изменяется и всегда возвращает значение по умолчанию.

Я нашел «правильный» способ сделать это и использую его вместо него, но мне все еще любопытно, так как я не понимаю, почему вышеперечисленное не должно работать.

Это максимально просто: выделить некоторую память, d, получить указатель на нее, скопировать несколько байтов в указанную этим память, вернуться. Не только это, , но когда я использую аналогичный код, но с d, являющимся массивом T, он отлично работает. Если только sh.AddrOfPinnedObject () на самом деле не указывает на d , но тогда какой в ​​этом смысл?

Кто-нибудь может сказать мне, почему вышеуказанное не работает?

5
задан sebf 27 January 2012 в 11:53
поделиться