キャストで遊んでいるだけです。2つのクラスがあるとします
public class Base
{
public int a;
}
public class Inh : Base
{
public int b;
}
両方をインスタンス化する
Base b1 = new Base {a = 1};
Inh i1 = new Inh {a = 2, b = 2};
では、アップキャストを試してみましょう
// Upcast
Base b2 = i1;
b2 は、Inh クラスでのみ表示されるフィールド b をまだ保持しているようです。ダウンキャストで確認してみましょう。
// Downcast
var b3 = b2;
var i2 = b2 as Inh;
var i3 = b3 as Inh;
bool check = (i2 == i3);
ここでチェックはtrueです(i2とi3が同じインスタンスi1を参照しているためだと思います)。わかりました、それらがどのように配列に格納されるか見てみましょう。
var list = new List<Base>();
list.Add(new Base {a = 5});
list.Add(new Inh {a = 10, b = 5});
int sum = 0;
foreach (var item in list)
{
sum += item.a;
}
合計は 15 であるため、すべて問題ありません。しかし、XmlSerializer を使用して配列をシリアル化しようとすると (内容を確認するためだけに)、InvalidOperationException "The type ConsoleApplication1.Inh was not expected" が返されます。基地の配列なので、まあ、まあまあです。
では、実際の b2 とは何でしょうか? Bases と Inhs の配列をシリアル化できますか? 逆シリアル化された配列から項目をダウンキャストして Inhs フィールドを取得できますか?