基到派生 class 的转换不会导致 null

Base to derived class conversion does not result in null

据我所知,我们不能直接将基 class 转换为派生(子)class,因为基不是派生的实例,因此它'将导致空值。

我有两个 classes,一个派生自另一个。我试图弄清楚为什么我可以将 baseClass1 转换为 Sub 而不会导致 null 而我无法将 baseClass2 转换为 Sub 因为它结果为空。

Base baseClass1 = new Sub(); // The result is an instance of Base
Base baseClass2 = new Base(); // Same thing
Sub subClass1 = (Sub)baseClass1; // Doesn't result in null
Sub subClass2 = (Sub)baseClass2; // Does result in null

baseClass1 是 Base 的实例,即使我使用了 Sub() 构造函数。但是使用 Sub() 构造函数以某种方式允许我将 Base 的实例转换为 Sub 的实例,甚至不会丢失 Sub class 的额外成员持有的值(假设我通过 Sub() 传递了这些值第一行的构造函数)。

这背后的逻辑是什么? baseClass1 和 baseClass2 之间的真正区别是什么,即使它们都是 Base 的实例?

the baseClass1 is an instance of Base, even though I used the Sub() constructor.

这完全不是真的。 baseClass1Sub 的一个实例,分配给类型为 Base 的变量。 这就是为什么你可以将它转换回 Sub

这是因为 baseClass1 实际上引用了 Sub 的实例。您不能将基 class 的实例转换为派生 class 的实例。这就是第二次演员表失败的原因。

object o = new object();
string s = (string) o;
int i = s.Length; // What can this sensibly do?

参考:

将 baseClass1 声明为什么类型并不重要,重要的是它指向的实际实例,因此即使您将其键入为 Base,堆上分配的类型实际上是 Sub...因此投射到 Sub 没问题