InvalidCastException对象[*]到Object []

时间:2010-04-19 10:35:58

标签: c# com integration casting visual-foxpro

我有一个用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#语法?

2 个答案:

答案 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)

在CLI术语中,

object[]向量;这些必须是0和1维。 object[*]是一个恰好是1维的数组,甚至可能(尽管不是在你的情况下)甚至是0。但它不是矢量。

您必须将数据复制到object[],而不是强制转换。我做了the same mistake here

您应该可以使用CopyTo

array.CopyTo(vector, 0);

(其中arrayobject[*]vectorobject[]