Well, there is still a bit of confusion.
The output that occurs has nothing to do with the Object.SomeProperty type, but it all depends on the types of expressions in the array initializer. In other words, you could do:
object o = new[] { "string1", "string2" };
and o will still be a reference to a string array.
Basically, the compiler looks at this expression:
new[] { A, B, C, D, ... }
(where A, B, C, D, etc. are expressions) and tries to work out the right type of array to use. It considers types A, B, C, and D (etc.) as the type of an array element. Accepting this set of candidate types, he tries to find one to which all others can be implicitly converted. If there is no such one type, then the compiler will complain.
So for example:
new[] { new Form(), new MemoryStream() }
will not compile - neither MemoryStream nor Form will be converted to others. But:
new[] { GetSomeIDisposable(), new MemoryStream() }
will be considered as IDisposable[] , because there is an implicit conversion from MemoryStream to IDisposable . Similar:
new[] { 0, 1, 3.5 } // double[] new[] { 1, 3, 100L } // long[]