有り得ない?代入

驚愕の事実の続き。

もっと具体的なサンプルで試してみた。

static void Main(string args)
{
    string array = new string[] {"foo", "bar"};
    IList list = new List();

    System.Console.WriteLine(" list Type : " + list.GetType().ToString());
    list = array; 
    System.Console.WriteLine(" list Type : " + list.GetType().ToString());
    list.Add("これは追加できるのか?");
}

このコードはコンパイルも通るし実行できる。

list Type : System.Collections.Generic.List`1[System.String]
list Type : System.String[]

'System.NotSupportedException' の初回例外が mscorlib.dll で発生しました

ナンダコリャー
  • 結論
1. IList<string>型の変数に、string[]の変数を直接代入できてしまう

2. string[]の変数にIList<string>型の変数は代入できない(不可逆どころかコンパイルもできない)

3. IList<string>型の変数に、string[]の変数を直接代入すると、元の変数の型はstring[]の変数になる

追記:

よくよく考えたら、別に3.は驚くべきものではないな。普段このような代入はコンパイルが通らないので、見ていないだけで、実際に代入互換性のある変数をランタイム上で上書きすると、その後の変数の型は上書きしたオブジェクトの型になっているのは当たり前だし。1.がOKってのに未だに惑わされているだけか。