开发者

InvalidCastException Object[*] to Object[]

I have a COM object written in Visual Fox Pro 9.0. It has the following procedure:

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

The COM object is referenced in a VS2010 project using C#. The signature of the procedure in C# is:

object GetArray(string vcArrayName);

When debugging I can see that the returned value is {object[1..1]} while the type is object {object[]}. Expanding the variable, I can see that it is an array of base 1 with one element which is an empty string ("");

However, I can not cast this value to object[]. I always get an InvalidCastException with a Norwegian message saying that I can't cast Object[*] to Object[].

A strange thing is that if the COM object returns a two dimensional array I have no problem casting it to object[,]. I find it very strange that two dimensions are easier to deal with than 开发者_运维技巧one!

The question I'd like answered is:

What is this Object[*] business? Can anybody tell me if it is a bad translation in the Norwegian exception message or if Object[*] is some kind of obscure C# syntax that I haven't heard of?


You are getting a multi-dimensional array with a dimension of 1 instead of a vector. The C# language doesn't allow you to declare an array like that. You can reference the return value with the Array class, which allows conversion with code similar to this:

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


object[] is a vector in CLI terms; these must be 0-based and 1-dimensional. object[*] is an array that happens to be 1-dimensional, and may even (although not in your case) even be 0-based. But it isn't a vector.

Rather than casting, you're going to have to copy the data out into an object[]. I made the same mistake here.

You should be able to use CopyTo:

array.CopyTo(vector, 0);

(where array is the object[*] and vector is the object[])

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜