すべての型はObjectから派生している

プログラミングC# 第6版 4.8


なんと全ての型は暗黙のうちにobject型から派生しているそうです。

class CClass {
}

class Program {
    static void Main () {
        // objectから派生しているので代入できる
        object cobj = new CClass();
    }
}

しかもintのようなデータもobject型からの派生らしいので以下のようなこともできます。

class Program {
    static void Main () {
        // こんなことができる
        object obj = 1;
    }
}

凄いですね。これをボックス化というらしいです。

ただしボックス化を行うとそのままでは元のデータ型に代入することはできません。

class Program {
    static void Main () {
        object obj = 1;
        
        // コンパイルエラー
        int i = obj;
    }
}
$ csc main.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.

main.cs(7,11): error CS0266: 型 'object' を 'int' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください)

ボックス化された値はボックス化を解除してからでないと代入できないようです。つまり以下のようにキャストを使うことになります。

class Program {
    static void Main () {
        object obj = 1;
        
        // intへキャスト
        int i = (int)obj;
    }
}

全てはobjectから派生しているっていうのはなかなかに凄いことですねぇ。

C++でもテンプレートテクニックにObjectから派生させて管理するっていう話がありましたね。

あれを言語仕様として組み込んである感じになるわけですね。