誰かがなぜこれがうまくいかないのか説明してもらえますか?
MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = obj; <-- error
obj が MyClass 型の同じメモリ ブロックを「指す」場合、最後の行で myClass2 を同じメモリ ブロックに「指す」ことができないのはなぜですか?
助けてくれてありがとう。
myClass2 の型は " MyClass
" です。である、またはから派生した型の任意の値をそれに割り当てることができますMyClass
。 object
ではなく、から派生していないためMyClass
、キャストが必要です。
これを暗黙的に行うことができた場合、実際には ではないオブジェクトでそれを行うとどうなるでしょうかMyClass
?
C# コンパイラでは、派生クラスから基底クラスへの暗黙的なキャストのみが許可され、その逆は許可されません。あなたの場合、オブジェクトから派生クラスである Myclass に明示的にキャストする必要があります
object
ここは基本クラスだからです。
私がこれを持っている場合:
class Square : Shape
{
}
class Circle : Shape
{
}
できます
Shape c = new Circle();
これを意味的に考えてみてください。円は形です。円を形状として保存できます。
しかし、私はできません:
Circle c = new Shape();
形状は円ではないため、正方形の可能性があります。検討:
Shape sq = new Square();
Shape cr = new Circle();
あなたの見方によれば、これはうまくいくはずです:
Circle x = cr;
しかし、キャストがなくてもこれはうまくいくはずです:
Circle x = sq;//this will blow up, sq is a square.
したがって、キャストが必要です。同様に、 anobject
は、 a Form
、 aButton
または aのいずれかになりMyClass
ます。正しい型でない場合にランタイムが例外をスローするように、キャストする必要があります。
C# は静的に型付けされた言語です。あなたはそれobj
がタイプであることを示しましたobject
。言語は静的に型付けされているため、指定した明示的な型をコンパイラが尊重し、 を であるかのようobj
に処理しようとしているという事実について不平を言うことしか期待できません。object
MyClass
MyClass myClass1 = new MyClass();
MyClass myClass2 = myClass1 ;
タイプ A のクラスを同じタイプの別のクラスに直接割り当てることはできますが、コンパイラはそのオブジェクトがどのタイプであるかを知らないため、タイプのないオブジェクトには割り当てることができません。その場合はキャストが必要です
MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = (MyClass)obj;
(MyClass)obj;
obj が MyClass 型であることをコンパイラに伝えているため、これは機能します