2014-09-05 73 views
3
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行。

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

谢谢!

卡菲基恩

+2

因为B不是D,所以不能将'new B()'强制转换为'D'。D是B。 – 2014-09-05 18:38:37

+2

每一只'狗'都是'动物',但不是每一只'动物'都是'狗' – user2711965 2014-09-05 18:39:01

回答

3

您可以将new DB因为D拥有一切B呢,再加上一些额外的东西。因此,将它看作B是安全的。

走另一条路,一个new B没有一切D了,所以如果你执行D特定功能,或访问一个D特定属性/成员,那就壮观失败。

因此,此作业/转换不安全或无效。

+1

非常感谢!我错过了底层类型的运行时类型是B但是引用是D的事实,当我们试图在B的实例上访问D的成员时,它会失败。 – Karthik 2014-09-05 19:10:09

相关问题