【问题标题】:FSharp and Microsoft Office PIAFSharp 和 Microsoft Office PIA
【发布时间】:2016-04-06 17:51:50
【问题描述】:

我正在使用 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:无法转换类型的对象 'System.String[*]' 输入 'System.String[]'。

是来自 COM 对象的强制转换导致了这种情况吗?我怎样才能正确地投射这个? * 是元组吗?如果是这样 string[,] 也不起作用...

谢谢

【问题讨论】:

    标签: f# ms-office


    【解决方案1】:

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

    你甚至可以从 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,你需要先把它转换成接口:

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

    您还可以使用以下方法获取具有索引值对的数组:

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

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      相关资源
      最近更新 更多