У меня есть код, предназначенный для получения структуры из байтового массива:
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
, но тогда какой в этом смысл?
Кто-нибудь может сказать мне, почему вышеуказанное не работает?