【问题标题】:Casting Between Types C#类型之间的转换 C#
【发布时间】:2018-03-17 19:34:51
【问题描述】:

为什么Console 显示类型B 而不是A,即使a2 已分配给new B()?我无法确切了解A a2 = new B() 中发生了什么。

class A { }
class B : A { }

...

A a1 = new A();
A a2 = new B();

Console.WriteLine(a2.GetType());

【问题讨论】:

  • GetType 显示object 的类型而不是variable 的类型。
  • 你的标题不能很好地反映实际问题。

标签: c# inheritance


【解决方案1】:

变量只是指向一个对象的东西。您可以通过继承自(或它实现的任何接口)的任何类型的变量来引用对象,但这不会改变对象本身的类型 - 这是 多态性 的一种形式在 C# 中。

【讨论】:

    【解决方案2】:

    因为您创建了类B 而不是A 的实例,并且由于OOP 的继承特性,当您从A 继承B 类时,您可以保存A 类型的变量。

    但是a2 的实际类型是B 而不是A 虽然它也可以表示为A,但是GetType() reutrns 运行时类型是B

    您也可以查看此SO post,它解释了GetType 预计会为对象返回什么以及typeof() 是什么以及我们如何使用is 进行继承层次结构检查。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      仅仅因为你通过类型A引用它并不意味着实际类型突然变为A,它仍然是一个B对象。您决定使用new B() 创建一个。

      【讨论】:

        【解决方案4】:

        您应该知道编译时类型和运行时类型之间的区别。编译时类型是编译器知道的类型,在这种情况下是您声明的类型 - A.运行时类型是在这种情况下恰好被变量引用的对象的类型 B.编译时间(编译器知道)和运行时(程序实际运行时会发生什么)是一个非常重要的区别,适用于类型、错误甚至计算。

        【讨论】:

          猜你喜欢
          • 2012-11-02
          • 2021-12-06
          • 2015-11-26
          • 1970-01-01
          • 1970-01-01
          • 2013-03-27
          • 2014-02-13
          • 1970-01-01
          • 2019-05-01
          相关资源
          最近更新 更多