为什么将基类型实例转换为派生类型对象/引用不是类型安全的

时间:2014-09-05 18:36:41

标签: c# .net oop clr

internal class B { }
internal class D : B { }

   class Program {

    static void Main(string[] args) {

    B dToB = new D();//will execute successfully. - line 1
    D bToD = (D) new B(); //will fail at runtime. - line 2

    }
}

我无法理解为什么从基类型实例到派生类型引用的转换/转换不被视为类型安全?

从技术上讲,对象D包含B的所有功能,因此它应该能够作为对它的基本实例的引用。不应该以其他方式例外吗?比如,第1行应该失败,但不是第2行。

只有当我们尝试从一种类型转换/转换为完全不同的类型时,类型安全是否会出现?如果基类型实例到派生类型引用是不允许的,另一种方式是允许的仅仅因为设计?

谢谢!

卡菲基恩

1 个答案:

答案 0 :(得分:3)

您可以将new D分配给B,因为D包含B所有内容,还有一些额外内容。因此,将其视为B

是安全的

另一方面,new B没有D所拥有的所有内容,因此如果您执行了D特定功能,或访问了D特定属性/会员,它会失败的。

因此,此赋值/强制转换不安全或无效。