Bien, todavía hay un pequeño poco confuso aquí.
La inferencia que está sucediendo no tiene nada que ver con el tipo de Object.SomeProperty, pero todo tiene que ver con los tipos de las expresiones en el inicializador de la matriz. En otras palabras, podría hacer:
object o = new[] { "string1", "string2" };
y o seguiría siendo una referencia a una matriz de cadenas.
Básicamente, el compilador se ve en una expresión como la siguiente:
new[] { A, B, C, D, ... }
(donde A, B, C, D, etc. son expresiones) y trata de resolver el tipo de matriz correcta para su uso. Solo considera los tipos de A, B, C y D (etc.) como el tipo de elemento de matriz. Tomando este conjunto de tipos de candidatos, trata de encontrar uno al que todos los demás puedan convertirse implícitamente. Si no hay exactamente un tipo, entonces el compilador se quejará.
Así, por ejemplo:
new[] { new Form(), new MemoryStream() }
no se compilará - ni MemoryStream
ni Form
es convertible a la otra. Sin embargo:
new[] { GetSomeIDisposable(), new MemoryStream() }
será tratado como un IDisposable[]
porque hay una conversión implícita MemoryStream
-IDisposable
. Del mismo modo:
new[] { 0, 1, 3.5 } // double[]
new[] { 1, 3, 100L } // long[]
Object.SomeProperty = {"string1", "string2"}; ¡No figura en ningún compilador de C#! Solo puedes hacer eso durante la inicialización. – leppie
inicialización, siendo la inicialización variable. p.ej. string [] foo = {"bar", "baz"}; – leppie
@leppie, aboslutamente a la derecha. Me corresponde corregido –