2

Visual FoxPro9.0で記述されたCOMオブジェクトがあります。次の手順があります。

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

COMオブジェクトは、C#を使用するVS2010プロジェクトで参照されます。C#でのプロシージャのシグネチャは次のとおりです。

object GetArray(string vcArrayName);

デバッグすると、戻り値が{object [1..1]}であり、タイプがobject{object[]}であることがわかります。変数を展開すると、空の文字列( "")である1つの要素を持つベース1の配列であることがわかります。

ただし、この値をobject[]にキャストすることはできません。Object[*]をObject[]にキャストできないというノルウェー語のメッセージを含むInvalidCastExceptionが常に発生します。

奇妙なことに、COMオブジェクトが2次元配列を返す場合、それをobject [、]にキャストしても問題はありません。2次元が1次元よりも扱いやすいのは非常に奇妙だと思います。

私が答えたい質問は次のとおりです。

このObject[*]ビジネスとは何ですか?それがノルウェーの例外メッセージの悪い翻訳なのか、それともObject [*]が私が聞いたことのないある種のあいまいなC#構文なのか、誰か教えてもらえますか?

4

2 に答える 2

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;
}
于 2010-04-19T11:52:51.443 に答える
4

object[]CLI用語でのベクトルです。これらは0ベースで1次元でなければなりません。object[*]はたまたま1次元の配列であり、(あなたの場合ではありませんが)0ベースでさえあるかもしれません。しかし、それはベクトルではありません。

キャストするのではなく、データをにコピーする必要がありますobject[]。私はここで同じ間違いをしました。

あなたは使用できるはずですCopyTo

array.CopyTo(vector, 0);

(はどこにarrayあり、object[*]vectorですobject[]

于 2010-04-19T11:32:46.170 に答える