PG日誌

各記事はブラウザの横幅を1410px以上にすると2カラムの見出しが表示されます。なるべく横に広げてみてください。

C# の is 演算子と typeof の型判定の挙動の違い

コード書けばすぐわかる事なんですが is 演算子の挙動の話です。

is 演算子は複数の型で true になる可能性があります。
親子関係がある型で厳密に型を判定したい場合、GetType() と typeof を使います。

// こんなクラスがあったとして、、
public class BaseClass { }
public class DerivedClass_1 : BaseClass { }
public class DerivedClass_2 : BaseClass { }

// こんなコードを書いたとすると結果がコメントのようになります
static void Main(string[] args)
{

    BaseClass test = new DerivedClass_1();

    // is演算子による型判定
    Console.WriteLine("test is BaseClass? = " + (test is BaseClass));
    Console.WriteLine("test is DerivedClass_1? = " + (test is DerivedClass_1));
    Console.WriteLine("test is DerivedClass_2? = " + (test is DerivedClass_2) + "\r\n");

    // test is BaseClass? = True ★親クラスも一 tureになる(互換性ありと判断できる
    // test is DerivedClass_1? = True
    // test is DerivedClass_2? = False

    // typeofによる型判定
    Console.WriteLine("test typeof BaseClass? = " + (test.GetType() == typeof(BaseClass)));
    Console.WriteLine("test typeof DerivedClass_1? = " + (test.GetType() == typeof(DerivedClass_1)));
    Console.WriteLine("test typeof DerivedClass_2? = " + (test.GetType() == typeof(DerivedClass_2)));

    // test typeof BaseClass? = False ★親クラスは一致しない (厳密に同じ型かどうか調べる
    // test typeof DerivedClass_1? = True
    // test typeof DerivedClass_2? = False
}

★の部分で違いがあります。

is演算子はアップキャストできる型の場合trueと覚えておくとよいでしょう。