派生类转换的基础不会导致null

时间:2015-05-24 04:31:40

标签: c# casting subclass base-class

只要我知道,我们就不能直接将基类转换为派生(子)类,因为基类不是派生的实例,因此它会导致null。 / p>

我有两个类,一个来自另一个。我试图找出为什么我可以将 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类的额外成员所持有的值(让我们说我通过Sub()传递了这些值第一行中的构造函数。)

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

3 个答案:

答案 0 :(得分:2)

  

baseClass1是Base的一个实例,即使我使用了Sub()构造函数。

这完全不正确。 baseClass1Sub分配给Base的变量的实例。这就是您可以将其强制转换回Sub的原因。

答案 1 :(得分:1)

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

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

参考:https://stackoverflow.com/a/729532

答案 2 :(得分:1)

你声明baseClass1的类型并不重要,它指向的实际实例很重要,因此即使你输入它作为Base,堆上的分配类型实际上是Sub ...因此施放到Sub很好