さて、ここにはまだ少し混乱があります。
行われている推論は、Object.SomePropertyのタイプとは関係ありませんが、配列初期化子の式のタイプとはすべて関係があります。言い換えれば、次のことができます。
object o = new[] { "string1", "string2" };
oは引き続き文字列配列への参照になります。
基本的に、コンパイラは次のような式を調べます。
new[] { A, B, C, D, ... }
(A、B、C、Dなどは式です)そして、使用する正しい配列型を見つけようとします。A、B、C、D(など)のタイプのみを配列要素タイプと見なします。この候補タイプのセットを使用して、他のすべてのタイプに暗黙的に変換できるものを見つけようとします。そのようなタイプが1つだけではない場合、コンパイラは文句を言います。
したがって、たとえば:
new[] { new Form(), new MemoryStream() }
コンパイルされません-どちらMemoryStream
もForm
他に変換できません。でも:
new[] { GetSomeIDisposable(), new MemoryStream() }
からへIDisposable[]
の暗黙の変換があるため、として扱われます。同じく:MemoryStream
IDisposable
new[] { 0, 1, 3.5 } // double[]
new[] { 1, 3, 100L } // long[]