3

キャストで遊んでいるだけです。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 フィールドを取得できますか?

4

4 に答える 4