C#_キャスト ( アップキャスト・ダウンキャスト )

アップキャスト
親クラス変数派生クラス代入すること。    Base b = new SubClass();

ダウンキャスト
がダウンキャスト。    SubClass s = new Base();

 

アップキャストは常に安全に行うことができるが、
ダウンキャストは危険な時もある。

 

ex )

    Base s1 = new Sub1(); // OK
    Base s2 = new Sub2(); // OK
   
    Base b;
    Sub1 s;
   
    b = s1;         // アップキャスト。暗黙的型な変換。実行すると b は Sub1だった気がする。
    s = (Sub1)b // ダウンキャスト。明示的なキャスト必要。
                // ないとコンパイルエラーとなる。「 Base を Sub1 に変換できません」
   
    b = s2;  // 実行すると b は Sub2 型。
    s = (Sub1)b;
    // コンパイルは通るが実行時にエラー。InvalidCastException 例外発生。
    // 「 Sub2 のオブジェクトを型 Sub1 にキャストできません」

 

対処 ( is 演算子 as 演算子 )

is 演算子

変換元 is 変換先型
変数元が変換先型にキャスト可能なら true、不可なら false。

ex )

    Base b = new Sub1();
    b = new Sub2();
    if( b is Sub1 ) // 結果は false
    {

C# 7 ではキャストできる時、キャストした結果を変数に入れることができる。
変換元 is 変換先型 キャストしたオブジェクト格納変数

    if(b is Sub2 sub2)
    {

 

as 演算子

変換先 = 変換元 as 型名
変換できない場合、結果が null になる。

ex )

    Base b = new Sub1();
    Sub1 s;
    s = b as Sub1; // OK
   
    b = new Sub2();
    s = b as Sub1;  // null

参照型への変換のみ。( ) 使用の型変換は値型・参照型問わず。sub s = (sub)super

 

 

こちらから。
https://ufcpp.net/study/csharp/oo_polymorphism.html
http://www.atmarkit.co.jp/ait/articles/0304/04/news004.html

 以上。