2010-04-19 33 views
2

我有用Visual Fox Pro 9.0编写的COM对象。它具有以下过程:InvalidCastException对象[*]对象[]

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

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

object GetArray(string vcArrayName); 

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

但是,我不能将此值转换为object []。我总是会收到一个InvalidCastException异常,说挪威语的消息说我不能将Object [*]转换成Object []。

奇怪的是,如果COM对象返回一个二维数组,我没有问题将它转换为object [,]。我觉得很奇怪,两个维度比一个维度更容易处理!

我想回答的问题是:

这是什么对象是[*]的公司吗?任何人都可以告诉我,如果这是挪威的异常消息中的错误翻译,或者Object [*]是某种我从未听说过的模糊的C#语法?

回答

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; 
} 
4

object[]是一个矢量在CLI术语;这些必须是基于0和1维的。 object[*]是一个数组,恰巧是一维的,甚至可能(尽管不是你的情况)甚至是基于0的数组。但它不是一个载体。

而不是铸造,你将不得不将数据复制到object[]。我做了the same mistake here

您应该能够使用CopyTo

array.CopyTo(vector, 0); 

(其中arrayobject[*]vectorobject[]

相关问题