2

「b[0]= new Child2();」行の理由を教えてください。コンパイル時ではなく実行時に失敗します。構文をチェックしないでください。ここで実行しただけです

class Base
{}

class Child1 : Base
{}

class Child2 : Base
{}

class Test
{
   void Main()
   {
     Base [] b= new Child1[10];
     b[0]= new Child2(); <-- Fails at runtime but not at compile time WHY?
   }
}
4

3 に答える 3

5
new Child1[10];

type の新しい配列を宣言しましたChild1

b[0]= new Child2();

ここで、兄弟クラスをそれに入れようとしています。オブジェクトの配列は、そのオブジェクトとそのサブクラスを格納できますが、兄弟を格納することはできません。

于 2013-06-07T10:32:41.057 に答える
1

Ilya Ivanov は正しく、Child1 オブジェクトの配列を Base オブジェクトの配列にキャストできます。ただし、これは別のクラスであるため、これに Child2 を追加することはできません。

配列の共分散とは、2 つのクラスにサブクラスとスーパークラスの関係がある場合、それらの配列にもこの関係があることを意味します。

于 2013-06-07T10:33:04.590 に答える
0

b を child1 の配列として定義してから、child2 を挿入しようとしています。

ただし、2 行間で何かが発生する可能性があるため、コンパイラは b に割り当てられたものを処理できません。ただし、実行時に決定できます。

于 2013-06-07T10:38:50.227 に答える