我正在使用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[]
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
System.InvalidCastException:无法将类型为'System.String [*]'的对象强制转换为'System.String []'.
COM对象的转换是否导致这种情况?我怎样才能正确地投射?是元组的*吗?如果是这样的话[,]也不起作用......
谢谢
Office互操作返回一个数组,其中索引不是从0开始,而是(可能)从1开始(旧的Visual Basic时间!)这就是*类型中的含义String[*].
你甚至可以用F#创建这样的数组:
let array = System.Array.CreateInstance(typeof<int>, [| 10 |], [| 1 |])
Run Code Online (Sandbox Code Playgroud)
不幸的是,它Int32[*]是一种不同的类型Int32[],因此铸造失败:
// System.InvalidCastException: Unable to cast
// object of type 'System.Int32[*]' to type 'System.Int32[]'.
array :?> int[]
Run Code Online (Sandbox Code Playgroud)
您需要以另一种方式将1索引数组中的数据转换为其他结构.array我的示例中的类型实现非泛型IEnumerable,因此您应该能够编写如下内容:
array |> Seq.cast<int> |> Array.ofSeq
Run Code Online (Sandbox Code Playgroud)
如果您的案例中的值类型是obj,您需要首先将其强制转换为接口:
(thing :?> IEnumerable) |> Seq.cast<string> |> Array.ofSeq
Run Code Online (Sandbox Code Playgroud)
您还可以使用以下内容获取具有索引值对的数组:
[| for i in array.GetLowerBound(0) .. array.GetUpperBound(0) ->
i, array.GetValue(i) :?> int |]
Run Code Online (Sandbox Code Playgroud)