2016-04-06 5 views
1

私はFSharpのMicrosoft Office PIAを使用しています。私がしようとすると、このように、マイクロソフトWordからSynonymInfoを取得する場合:FSharpとMicrosoft Office PIA

#r "Office.dll" 
#r "Microsoft.Office.Interop.Word.dll" 
open Microsoft.Office.Interop.Word 

let application = ApplicationClass() 
let synonymInfo = application.SynonymInfo("bracket") 
let meaningList = synonymInfo.MeaningList :?> string[] 

私はこの例外を取得しています:

System.InvalidCastExceptionの:タイプ のオブジェクトをキャストできません「可能System.String [*] 'to' System.String [] 'と入力します。

COMオブジェクトからのキャストがこれを引き起こしていますか?これを正しくキャストするにはどうすればよいですか? *タプルは?その文字列[、]も動作しない場合は...

おかげ

答えて

5

オフィス相互運用機能は、インデックスが1から(おそらく)0から始めるのではなく、配列を返す(古き良きVisual Basicの回!)これは、タイプString[*]*の意味です。

あなたも、F#2からそのようなアレイを作成することができます。

let array = System.Array.CreateInstance(typeof<int>, [| 10 |], [| 1 |]) 

残念ながら、Int32[*]Int32[]とは異なるタイプがあるので、キャストが失敗した:

// System.InvalidCastException: Unable to cast 
// object of type 'System.Int32[*]' to type 'System.Int32[]'. 
array :?> int[] 

あなたはデータを変換する必要があります他の方法では、1つのインデックス付き配列を別の構造体に変換します。私の例ではarrayの種類は、非ジェネリックIEnumerable実装ので、あなたのような何かを書くことができる必要があります:

array |> Seq.cast<int> |> Array.ofSeq 

あなたの場合の値の型がobjある場合、あなたはそれをキャストする必要があります最初のインターフェイス:

[| for i in array.GetLowerBound(0) .. array.GetUpperBound(0) -> 
    i, array.GetValue(i) :?> int |] 

(thing :?> IEnumerable) |> Seq.cast<string> |> Array.ofSeq 

また、このようなものを使用してインデックスと値のペアを持つ配列を得ることができます

関連する問題