【问题标题】:InvalidCastException Object[*] to Object[]InvalidCastException Object[*] 到 Object[]
【发布时间】:2010-04-19 10:35:58
【问题描述】:

我有一个用 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[]}。展开变量,我可以看到它是一个以 1 为基数的数组,其中一个元素是一个空字符串 ("");

但是,我不能将此值转换为 object[]。我总是收到 InvalidCastException 并带有一条挪威消息,说我无法将 Object[*] 转换为 Object[]。

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

我想回答的问题是:

这个 Object[*] 业务是什么?谁能告诉我这是否是挪威异常消息中的错误翻译,或者 Object[*] 是否是某种我没听说过的晦涩的 C# 语法?

【问题讨论】:

    标签: c# com integration casting visual-foxpro


    【解决方案1】:

    您将获得一个维度为 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】:

      object[] 是 CLI 术语中的 vector;这些必须是基于 0 和 1 维的。 object[*] 是一个恰好是一维的数组,甚至可能(尽管不是您的情况)甚至是从 0 开始的。但它不是向量。

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

      你应该可以使用CopyTo:

      array.CopyTo(vector, 0);
      

      (其中array 是object[*] 而vector 是object[])

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        • 2015-07-03
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多