У меня есть функция, которая заполняет массив типа sbyte [], и мне нужно передать этот массив другой функции, которая принимает параметр типа byte [].
Можно ли легко и быстро преобразовать его, не копируя все данные или используя unsafe magic?
Ответ 1
Да, вы можете.
Поскольку оба byte и sbyte имеют одинаковое двоичное представление, нет необходимости копировать данные.
Просто сделайте бросок в Array, затем отбросьте его на byte[], и этого будет достаточно.
Вам нужно будет скопировать данные (только массивы ссылочного типа являются ковариантными), но мы можем попытаться сделать это эффективно; Buffer.BlockCopy, похоже, работает:
sbyte[] signed = { -2, -1, 0, 1, 2 };
byte[] unsigned = new byte[signed.Length];
Buffer.BlockCopy(signed, 0, unsigned, 0, signed.Length);
Если это был ссылочный тип, вы можете просто указать ссылку без дублирования массива:
Foo[] arr = { new Foo(), new Foo() };
IFoo[] iarr = (IFoo[])arr;
Console.WriteLine(ReferenceEquals(arr, iarr)); // true
Ответ 3
Если вы используете .NET 3.5+, вы можете использовать следующее:
byte[] dest = Array.ConvertAll(sbyteArray, (a) => (byte)a);
Что, я думаю, эффективно копирует все данные.
Обратите внимание, что эта функция также находится в .NET 2.0, но вам придется использовать анонимный метод.