C类型之间的转换#

时间:2018-03-17 19:34:52

标签: c# inheritance

为什么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());

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

因为您已经创建了类B的实例而不是A,并且由于OOP的继承功能,您可以保留类型A的变量,因为您继承了{{1}来自B的课程。

A的实际类型为a2而不是B,但它也可以表示为A,但A会重新运行时间类型是GetType()

您也可以查看此SO post,其中说明了对象的B应返回的内容,GetType是什么以及我们如何使用typeof()用于继承层次结构检查。

希望它有所帮助。

答案 2 :(得分:0)

仅仅因为您通过try catch类型引用它并不意味着实际类型突然变为const fetchItem = async() => { try { const response = await axios("http://localhost:4000/items?id=2"); console.log(response.data); } catch (error) { console.log(error) } }; ,它仍然是A个对象。您决定使用A创建一个。

答案 3 :(得分:0)

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

相关问题