2016-04-06 17 views
1

FSharp'ın Microsoft Office PIA'sini kullanıyorum. Ben denemek ve bunun gibi, Microsoft Word SynonymInfo olsun:FSharp ve Microsoft Office PIA

System.Web.HttpUnhandledException: Bu özel durum alıyorum

#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[] 

tip nesne artığını açılamıyor 'System.String [*] 'System.String []' yazın.

Döküm, COM nesnesine neden oluyor mu? Bunu nasıl doğru bir şekilde yapabilirim? Bir tuple için mi? böylece dize [,] de çalışmazsa ...

Teşekkür

endeksi 0'dan başlamak değil, nerede

cevap

5

Büro birlikte çalışma dizisi döndürür (muhtemelen) 1 den (iyi eski Visual Basic zamanlarda!) Bu, *'un String[*] türünde anlamıdır.

Hatta F # tür diziler oluşturabilirsiniz:

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

Maalesef Int32[*]Int32[] farklı bir türüdür ve bu nedenle döküm başarısız:

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

Verileri dönüştürmek gerekir 1-indeksli dizide başka bir şekilde başka bir yapıya. Benim örnekte array tipi olmayan jenerik IEnumerable uygular, böylece gibi bir şey yazmak mümkün olmalıdır:

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

sizin durumunuzda değerin tipi obj ise, bunu döküm gerekir ilk arayüzü:

[| for i in array.GetLowerBound(0) .. array.GetUpperBound(0) -> 
    i, array.GetValue(i) :?> int |] 
: Ayrıca böyle bir şey kullanarak endeks değer çiftine sahip bir dizi alabilirsiniz

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

İlgili konular