我有一个用Visual Fox Pro 9.0编写的COM对象。它有以下程序:
PROCEDURE GetArray(m.vcArrayName as String) as array
RETURN @&vcArrayName
使用C#在VS2010项目中引用COM对象。 C#中过程的签名是:
object GetArray(string vcArrayName);
调试时,我可以看到返回的值是{object [1..1]},而类型是object {object []}。扩展变量,我可以看到它是一个基数1的数组,其中一个元素是一个空字符串(“”);
但是,我无法将此值转换为object []。我总是得到一个带有挪威语消息的InvalidCastException,说我无法将Object [*]强制转换为Object []。
奇怪的是,如果COM对象返回一个二维数组,我将它转换为对象[,]是没有问题的。我觉得很奇怪两个维度比一个维度更容易处理!
我想回答的问题是:
这个对象[*]业务是什么?任何人都可以告诉我,如果它是挪威异常消息中的错误翻译,或者对象[*]是否是某种我从未听说过的模糊C#语法?
答案 0 :(得分:5)
您将获得一个维度为1而不是向量的多维数组。 C#语言不允许您声明这样的数组。您可以使用Array类引用返回值,该类允许使用与此类似的代码进行转换:
public static object[] ConvertFoxArray(Array arr) {
if (arr.Rank != 1) throw new ArgumentException();
object[] retval = new object[arr.GetLength(0)];
for (int ix = arr.GetLowerBound(0); ix <= arr.GetUpperBound(0); ++ix)
retval[ix - arr.GetLowerBound(0)] = arr.GetValue(ix);
return retval;
}
答案 1 :(得分:4)
object[]
是向量;这些必须是0和1维。 object[*]
是一个恰好是1维的数组,甚至可能(尽管不是在你的情况下)甚至是0。但它不是矢量。
您必须将数据复制到object[]
,而不是强制转换。我做了the same mistake here。
您应该可以使用CopyTo
:
array.CopyTo(vector, 0);
(其中array
是object[*]
而vector
是object[]
)