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

本文关键字:类型 引用 类型安全 对象 派生 基类 实例 转换 为什么 | 更新日期: 2023-09-27 18:20:52

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 行不会失败。

类型

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

谢谢!

卡提凯扬

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

你可以为

B分配一个new D,因为D拥有B所做的一切,以及一些额外的东西。因此,将其视为B是安全的。

反过来说,new B并不具备D所拥有的一切,所以如果你执行了一个D特定的函数,或者访问了一个D特定的属性/成员,它会失败得很惨。

因此,此分配/强制转换不安全或无效。