代码之家  ›  专栏  ›  技术社区  ›  Guge

InvalidCastException对象[*]到对象[]

  •  2
  • Guge  · 技术社区  · 16 年前

    我有一个用visualfoxpro9.0编写的COM对象。其程序如下:

        PROCEDURE GetArray(m.vcArrayName as String) as array
    RETURN @&vcArrayName
    

    COM对象在VS2010项目中使用C#引用。C中程序的签名为:

    object GetArray(string vcArrayName);
    

    调试时,我可以看到返回值是{object[1..1]},而类型是object{object[]}。展开变量,我可以看到它是一个基1的数组,其中一个元素是空字符串(“”);

    但是,我无法将此值强制转换为对象[]。我总是收到一个InvalidCastException,其中一条挪威消息说我不能将Object[*]强制转换为Object[]。

    奇怪的是,如果COM对象返回一个二维数组,我可以将其转换为object[,]。我觉得很奇怪,二维比一维更容易处理!

    我想回答的问题是:

    这个对象[*]是什么业务?有人能告诉我这是挪威例外消息中的错误翻译,还是Object[*]是某种我没听说过的晦涩的C#语法吗?

    2 回复  |  直到 16 年前
        1
  •  5
  •   Guge    16 年前

    得到的多维数组的维数是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;
    }
    
        2
  •  4
  •   Marc Gravell    16 年前

    object[] 是一个 矢量 在CLI方面;这些 以0为基础,一维。 object[*]

    对象[] . 我做的 the same mistake here .

    你应该可以使用 CopyTo :

    array.CopyTo(vector, 0);
    

    (其中 array vector 对象[]