У меня есть эти 2 структуры:
[StructLayout(LayoutKind.Sequential)]
unsafe struct ReinterpretableStruct
{
public int a; // 0 - 1 - 2 - 3
public fixed byte buffer[4]; // 4 - 5 - 6 - 7
public double x; // 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15
}
[StructLayout(LayoutKind.Sequential)]
unsafe struct OtherReinterpretableStruct
{
public ushort a; // 0 - 1
public fixed byte buffer[2]; // 2 - 3
public float y; // 4 - 5 - 6 - 7
public long w; // 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15
}
Они оба 16 байтов без заполнения, как показано в комментариях.Я возился с фиксированными буферами и преобразованиями указателей, и у меня возникла странная проблема.
Assert.True(b.a == *(ushort*)&a.a);
string bufferAsUnsignedShort = (*(ushort*) b.buffer).ToString();
Assert.True(*(ushort*)b.buffer == *((ushort*)&a) + 1);
Assert.True(b.y == *(float*)a.buffer);
Assert.True(b.w == *(long*)&a.x);
Первая строка работает, как и ожидалось, пропуская Assert.Однако третья строка не соответствует утверждению.Странная часть в том, что когда я ставлю точку останова на 3-й строке, я вижу следующее: [Описание: изображение точки останова VS с текстом «CS1666: вы не можете использовать фиксированный размер»буферы, содержащиеся в нефиксированных выражениях. Попробуйте использовать оператор fixed. "]
Это само по себе странно для меня, так как это ошибка компилятора, и при компиляции не возникало никаких проблем.Без точки останова он работает, но не так, как ожидалось.
Я, естественно, пытался исправить a) структуру и b) сам буфер, но ни один из них не работал, говоря что-то вроде: «Не могу получить адресуже фиксированная переменная через fixed
Как мне решить эту проблему?