gpt4 book ai didi

f# - FSharp 和 Microsoft Office PIA

转载 作者:行者123 更新时间:2023-12-02 00:55:00 25 4
gpt4 key购买 nike

我正在使用 FSharp 的 Microsoft Office PIA。当我尝试像这样从 Microsoft Word 获取 SynonymInfo 时:

#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: Unable to cast object of type 'System.String[*]' to type 'System.String[]'.

是 COM 对象的转换导致的吗?我怎样才能正确转换这个? * 是元组吗?如果是这样 string[,] 也不起作用...

谢谢

最佳答案

Office 互操作返回一个数组,其中索引不是从 0 而是(可能)从 1(好旧的 Visual Basic 时代!)这就是类型 中的 * 的含义字符串[*].

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

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,您需要先将其转换为接口(interface):

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

您还可以使用类似这样的方式获取包含索引值对的数组:

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

关于f# - FSharp 和 Microsoft Office PIA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36447260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com