Проблема (из того, что я вижу) в том, что вы объединили ссылки массивов - так, какой массив будет установлен последним, победит. Когда есть массив, он использует индексатор (а не смещение в байтах) - поэтому размер не имеет значения.
Способ сделать это "должным образом" (или неправильно, в зависимости от обстоятельств), вероятно, будет с помощью небезопасного кода - с указателем на массив - что-то вроде:
IndexStruct s = new IndexStruct();
s.data = new byte[] { 1, 0, 0, 0, 1, 1 };
unsafe
{
fixed (short* data = s.idx16)
{
Console.WriteLine(data[0]); // should be 1 (little-endian)
Console.WriteLine(data[1]); // should be 0
Console.WriteLine(data[2]); // should be 257
}
}
Конечно, я не уверен, что рекомендую это - но это, кажется, достигает того, чего вы хотите?
Мне также интересно, можете ли вы полностью сбросить struct
и просто использовать небезопасный доступ к byte[]
напрямую:
byte[] raw = new byte[] { 1, 0, 0, 0, 1, 1 };
unsafe
{
fixed (byte* addr = raw)
{
short* s = (short*)addr;
Console.WriteLine(s[0]); // should be 1
Console.WriteLine(s[1]); // should be 0
Console.WriteLine(s[2]); // should be 257
}
}