C# 关于C中的base#

C# 关于C中的base#,c#,base,C#,Base,有人能告诉我为什么它输出的是“B”而不是“Object”,base.GetType()没有得到A的父对象,因此是根对象吗 非常感谢,因为 namespace contest { class Program { static void Main(string[] args) { B b = new B(); } } class A { public A() {

有人能告诉我为什么它输出的是“B”而不是“Object”,base.GetType()没有得到A的父对象,因此是根对象吗

非常感谢,因为

namespace contest
{
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
        }
    }

    class A {
        public A() {
            k();
        }
        private void k() {
            Console.WriteLine(base.GetType().Name);
        }        
    }

    class B : A {

    }
}
表示“调用父类的
GetType()
方法”,尽管您尚未重写它。因此
base.GetType()
以及
this.GetType()
将始终返回类
B

,因为

namespace contest
{
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
        }
    }

    class A {
        public A() {
            k();
        }
        private void k() {
            Console.WriteLine(base.GetType().Name);
        }        
    }

    class B : A {

    }
}

表示“调用父类的
GetType()
方法”,尽管您尚未重写它。因此
base.GetType()
以及
this.GetType()
将始终返回类
B

B实现/继承自A,当您初始化B=new B()时,它将只使用A的内脏,因此返回B的类型。尝试使用B=new B();这应该返回A。您需要重写方法并将A定义为抽象。

B实现/继承自A,当您初始化B=new B()时,它将只使用A的内部,因此返回B的类型。尝试使用B=new B();这应该返回A。您需要重写方法并将A定义为抽象。

GetType
是在
System.Object
上定义的,并且不是虚拟的。它提供元数据中对象的运行时类型。因此,无论您在何处调用它(在构造函数或虚拟方法中),或者如果您使用
base
this
,您总是调用相同的方法。您将始终获得运行时类型,但可为null的类型除外,在这种情况下,您将获得底层类型。我猜这是由于nullables的特殊装箱行为造成的。请参阅关于标识可为空类型的说明。

GetType
是在
System.Object
上定义的,不是虚拟的。它提供元数据中对象的运行时类型。因此,无论您在何处调用它(在构造函数或虚拟方法中),或者如果您使用
base
this
,您总是调用相同的方法。您将始终获得运行时类型,但可为null的类型除外,在这种情况下,您将获得底层类型。我猜这是由于nullables的特殊装箱行为造成的。请参阅关于标识可为null的类型。

事实上,
GetType
不是虚拟的,因此您无法重写它。您的意思是,如果方法foo()不是虚拟的或重写的,那么调用base.foo()始终等于此.foo()?事实上,
GetType
不是虚拟的,因此您无法重写它。您的意思是如果方法foo()不是虚拟的或重写的,那么调用base.foo()是否始终等于此.foo()?