【发布时间】:2021-08-29 18:21:25
【问题描述】:
前几天在一次采访中,我被要求解释以下案例:
public class Parent
{
}
public class Child:Parent
{
}
案例1:
Parent p = new Child();
var c = (Child)p;
案例2:
Parent p = new Parent();
var c = (Child)p;
我说case1有效,case2无效,但他问:
为什么
case2无效,而p变量在case1和case2是Parent类的类型吗?
在 case2 中,我们通过以下消息得到运行时异常:
无法将“父”类型的对象转换为“子”类型
虽然在case1 p 变量也是Parent 类的类型。
他要我从stack 和heap 记忆的角度来解释。
你有什么想法吗?
更新:
面试官误导我的地方正是他在两种情况下都说p 是“父”类的类型,根据答案,两个变量的静态类型都是“父”,但在运行时它们有不同的类型,真正重要的是运行时类型。
【问题讨论】:
-
因为 case 2
p不是Child类型,因此不能转换为一个。在情况 1 中,这不是问题,因为尽管存储在Parent变量中,p实际上 IS 是一个Child实例。您可以通过创建一个new object()实例来进行比较。在 c# 中,任何东西都是对象,但对象不是一切。 -
这能回答你的问题吗? Upcasting and its effect on the heap
-
好的,那么在 case1 是 Child 类型但它的类型是在运行时而不是编译时定义的情况下说 'p' 是否正确? @Jack T. Spades
-
我想知道面试官通过询问堆栈和堆存储得到了什么;您所描述的问题与两者都没有太大关系。
标签: c# oop stack heap-memory