InvalidCastException Object [*] в Object [] - PullRequest
       29

InvalidCastException Object [*] в Object []

2 голосов
/ 19 апреля 2010

У меня есть COM-объект, написанный на Visual Fox Pro 9.0. Он имеет следующую процедуру:

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

На COM-объект ссылаются в проекте VS2010 с использованием C #. Подпись процедуры в C #:

object GetArray(string vcArrayName);

При отладке я вижу, что возвращаемое значение - {объект [1..1]}, а тип - объект {объект []}. Развернув переменную, я вижу, что это массив базы 1 с одним элементом, который является пустой строкой ("");

Однако я не могу привести это значение к объекту []. Я всегда получаю InvalidCastException с норвежским сообщением о том, что я не могу привести Object [*] к Object [].

Странно то, что если COM-объект возвращает двумерный массив, у меня нет проблем с приведением его к объекту [,]. Мне очень странно, что с двумя измерениями легче иметь дело, чем с одним!

Вопрос, на который я хотел бы получить ответ:

Что это за объект [*] бизнес? Кто-нибудь может мне сказать, является ли это плохим переводом в норвежском сообщении об исключении или Object [*] является неким неясным синтаксисом C #, о котором я не слышал?

Ответы [ 2 ]

5 голосов
/ 19 апреля 2010

Вы получаете многомерный массив с размером 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 голосов
/ 19 апреля 2010

object[] является вектором в терминах CLI; эти должны быть 0-мерными и одномерными. object[*] - это массив, который оказывается одномерным и может даже (хотя и не в вашем случае) даже основываться на 0. Но это не вектор.

Вместо приведения вам нужно будет скопировать данные в object[]. Я сделал ту же ошибку здесь .

Вы должны быть в состоянии использовать CopyTo:

array.CopyTo(vector, 0);

(где array - это object[*], а vector - это object[])

...