Почему я получаю ошибку CS1666, по-видимому, во время выполнения? - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть эти 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-й строке, я вижу следующее: A picture of a VS breakpoint showing the text [Описание: изображение точки останова VS с текстом «CS1666: вы не можете использовать фиксированный размер»буферы, содержащиеся в нефиксированных выражениях. Попробуйте использовать оператор fixed. "]

Это само по себе странно для меня, так как это ошибка компилятора, и при компиляции не возникало никаких проблем.Без точки останова он работает, но не так, как ожидалось.

Я, естественно, пытался исправить a) структуру и b) сам буфер, но ни один из них не работал, говоря что-то вроде: «Не могу получить адресуже фиксированная переменная через fixed

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 23 декабря 2018

Я не вижу здесь никаких проблем.Попробуйте следующее и посмотрите, что у вас получится:

using System;
using System.Runtime.InteropServices;

namespace Demo
{
    [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
    }

    class Program
    {
        public static void Main()
        {
            unsafe
            {
                var a = new ReinterpretableStruct();
                var b = new OtherReinterpretableStruct();

                int size1 = *(ushort*) b.buffer;
                int size2 = *((ushort*) &a) + 1;

                Console.WriteLine(size1);
                Console.WriteLine(size2);
            }
        }
    }
}

Когда я запускаю это, я вижу следующий вывод:

0
1

Это ожидаемый вывод с учетом инициализированных по умолчанию структур.

...