3

我有一个object通过 COM 互操作调用的参数,传入的对象的类型是System.Byte[*],我想把它变成byte[]; 有没有办法在不复制的情况下做到这一点?

显式转换和as关键字都失败。奇怪的是,如果我中断我的函数,这两种方法都可以在“立即”窗口中按我想要的方式工作。

public void DoIt(object param) {
    var bbuf = param as byte[];
    // bbuf is NULL here

    bbuf = (byte[])param;
    // Throws cast exception

    // This works, but I don't want to copy
    var abuf = param as Array;
    bbuf = new byte[abuf.Length];
    abuf.CopyTo(bbuf, 0);
}
4

1 回答 1

8

该类型byte[*]是一个非零下界一维数组。例如,下限为 1 的数组。正常的一维数组是从零开始的(SZ 数组)。在我看来,唯一的做法是复制它:

public static T[] ToSZArray<T>(Array array)
{
    T[] dest = new T[array.Length];
    Array.Copy(array, dest, array.Length);
    return dest;
}

完整代码

不幸的是,我在byte[*]. 我唯一知道的是这个byte[*]名字是用来突出它和 SZ-array 之间的区别的byte[]。后者在 CLI 中有特殊的支持和说明。


示例用法:

// Create an array string[1..4]
var arr = Array.CreateInstance(typeof(string),
    lengths: new[] { 4 },
    lowerBounds: new[] { 1 });

// Some values.
arr.SetValue("1", 1);
arr.SetValue("2", 2);
arr.SetValue("3", 3);
arr.SetValue("4", 4);

// The conversion to an SZ-array.
string[] dest = ToSZArray<string>(arr);
于 2013-11-13T21:42:35.330 回答