none
base.GetType と this.GetType の違いについて RRS feed

  • 質問

  • class Base
    {
    
    }
    
    class This
    {
        internal void Method()
        {
            var baseType = base.GetType();
            var thisType = this.GetType();
        }
    }

    上記のようなコードでMethod()を実行すると、baseType にも、 thisType にも This の Type型が入ります。

    baseType は Base で thisType は This にならないのは、なぜでしょうか?

    2016年10月6日 5:44

回答

  • こんにちは。

    GetTypeは実体の型を返すので、This型になります。
    継承元が取得したければ、BaseTypeプロパティを使ってはどうですか。

    var baseType = this.GetType().BaseType;
    var thisType = this.GetType();
    • 回答としてマーク IkuhanaRock 2016年10月6日 6:03
    2016年10月6日 5:55
    モデレータ
  • GetTypeメソッドが定義されているのは、Baseのさらに親となるObjectクラスであり、BaseクラスおよびThisクラスにGetTypeメソッドが定義されているわけではありません。

    ですので、base.GetTypeだろうがthis.GetTypeだろうが呼び出すのは同じ、Objectクラスに定義されたGetTypeメソッドです。同じメソッドなので同じ結果を返します。

    base.Hoge という呼び出しが意味を持つのは、自分が親(を含む祖先)と同じシグネチャ(=引数と返値)を持つメンバを定義しているときに、どちらのメソッドを呼び出すのかというときです。

    • 回答としてマーク IkuhanaRock 2016年10月6日 6:03
    2016年10月6日 5:57

すべての返信

  • こんにちは。

    GetTypeは実体の型を返すので、This型になります。
    継承元が取得したければ、BaseTypeプロパティを使ってはどうですか。

    var baseType = this.GetType().BaseType;
    var thisType = this.GetType();
    • 回答としてマーク IkuhanaRock 2016年10月6日 6:03
    2016年10月6日 5:55
    モデレータ
  • GetTypeメソッドが定義されているのは、Baseのさらに親となるObjectクラスであり、BaseクラスおよびThisクラスにGetTypeメソッドが定義されているわけではありません。

    ですので、base.GetTypeだろうがthis.GetTypeだろうが呼び出すのは同じ、Objectクラスに定義されたGetTypeメソッドです。同じメソッドなので同じ結果を返します。

    base.Hoge という呼び出しが意味を持つのは、自分が親(を含む祖先)と同じシグネチャ(=引数と返値)を持つメンバを定義しているときに、どちらのメソッドを呼び出すのかというときです。

    • 回答としてマーク IkuhanaRock 2016年10月6日 6:03
    2016年10月6日 5:57
  • 「Objectクラスに定義されたメソッド」というので、納得できました。ご回答ありがとうございます。

    2016年10月6日 6:08
  • 「実体の型を返す」というのでこの動きが納得しました。

    BaseTypeプロパティは、そのためにあるんですね。ご回答ありがとうございました。

    2016年10月6日 6:10