新しいB()と新しいA()が呼び出されると、正確にはどうなりますか?
ここで、1行目は正常にコンパイルされ、2行目は型キャストエラーを表示しています。なぜこれが起こるのか。
B
サブクラスなので、型の参照が実行時型のオブジェクトを参照するA
ことは有効です。結局のところ、は単にの「特殊なケース」です。A
B
B
A
A
ただし、すべてのsをsと見なすことができるわけではないため、その逆は当てはまりませんB
。これは、「実際の」非互換性がない場合でも、C#の安全な型システムによって厳密に適用されますが、そのような制限の理由は当然です。たとえば、B
プロパティを宣言したと想像してくださいpublic int Foo {get; set;}
。これがどのように動作することを期待しますか:
B ob = new A();
ob.Foo = 5;
これは明らかに非論理的です。参照が参照している実際のオブジェクトには、そのようなプロパティはありません。したがって、コンパイラはそのような構成を禁止します。
ここで、コードを次のように変更したと想像してください。
B b = (B)new A();
ここでは、作成されたオブジェクトが実行時にタイプの参照に割り当て可能になることをコンパイラーに通知していますB
。これは正常にコンパイルされますが、アサーションが明らかに正しくないため、ランタイムInvalidCastException
がスローされます。
要約すると、C#の型システム(無視dynamic
し、いくつかの特殊なケースがある場合)は静的で安全A
です。具体的なインスタンスを、型であるかのように正常に処理することはできませんB
。