COM Interop: int[*] cannot be cast to… anything useful? 12 June 2011Posted by golda972 in C#, exception, interop, Windows.
What’s to be done with a non-zero based array in .NET?
Back in the day of VB6, arrays were commonly started at 1. So you had arrays of three members: 1, 2, and 3.
But VB6 is no longer being supported, and today we have (in its place?) VB.NET and, of course C#. Theoretically all arrays forever after shall be 0-based… except. VBA (which looks a lot like VB6) still uses 1-based arrays. And Microsoft Office’s Interop libraries are in VBA.
So a property like Range().SynonymInfo.PartOfSpeechList returns int[*], a 1-based array of integers. Which is utterly useless in .NET.
All the old posts (on StackOverflow, eg) suggest casting a non-zero based array (like int[*]) to the untyped Array. This works fine through .NET 3.5. In .NET 4.0 this cast is invalid, though.
Cast to Object, and then you can cast to Array… even in .NET 4.0:
Object objThings = (Object)Range().SynonymInfo.PartOfSpeechList;
Array things = (Array)objThings;