F# FSharp和Microsoft Office PIA

F# FSharp和Microsoft Office PIA,f#,ms-office,F#,Ms Office,我正在使用来自FSharp的Microsoft Office PIA。当我尝试从Microsoft Word获取同义词信息时,如下所示: #r "Office.dll" #r "Microsoft.Office.Interop.Word.dll" open Microsoft.Office.Interop.Word let application = ApplicationClass() let synonymInfo = application.SynonymInfo("bracket")

我正在使用来自FSharp的Microsoft Office PIA。当我尝试从Microsoft Word获取同义词信息时,如下所示:

#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[]
[| for i in array.GetLowerBound(0) .. array.GetUpperBound(0) ->
     i, array.GetValue(i) :?> int |]
我得到一个例外:

System.InvalidCastException:无法强制转换类型为的对象 “System.String[*]”以键入“System.String[]”

COM对象的强制转换是否导致此问题?我怎样才能正确地投射这个?*代表一个元组吗?如果是,字符串[,]也不起作用


谢谢

Office interop返回一个数组,其中索引不是从0开始,而是(可能)从1开始(很好的旧Visual Basic时间!)。这就是
*
在类型
字符串[*]
中的意思

您甚至可以从F#创建这样的数组:

您需要以另一种方式将1索引数组中的数据转换为其他结构。在我的示例中,
array
的类型实现了非泛型的
IEnumerable
,因此您应该能够编写如下代码:

array |> Seq.cast<int> |> Array.ofSeq
您还可以使用以下方法获得具有索引值对的数组:

#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[]
[| for i in array.GetLowerBound(0) .. array.GetUpperBound(0) ->
     i, array.GetValue(i) :?> int |]

Office interop返回一个数组,其中索引不是从0开始,而是(可能)从1开始(很好的旧Visual Basic时间!)。这就是
*
在类型
字符串[*]
中的意思

您甚至可以从F#创建这样的数组:

您需要以另一种方式将1索引数组中的数据转换为其他结构。在我的示例中,
array
的类型实现了非泛型的
IEnumerable
,因此您应该能够编写如下代码:

array |> Seq.cast<int> |> Array.ofSeq
您还可以使用以下方法获得具有索引值对的数组:

#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[]
[| for i in array.GetLowerBound(0) .. array.GetUpperBound(0) ->
     i, array.GetValue(i) :?> int |]