2010-04-19 66 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[]