2

誰かがなぜこれがうまくいかないのか説明してもらえますか?

MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = obj; <-- error

obj が MyClass 型の同じメモリ ブロックを「指す」場合、最後の行で myClass2 を同じメモリ ブロックに「指す」ことができないのはなぜですか?

助けてくれてありがとう。

4

5 に答える 5

7

myClass2 の型は " MyClass" です。である、またはから派生した型の任意の値をそれに割り当てることができますMyClassobjectではなく、から派生していないためMyClass、キャストが必要です。

これを暗黙的に行うことができた場合、実際には ではないオブジェクトでそれを行うとどうなるでしょうかMyClass?

于 2012-06-13T04:54:52.493 に答える
7

C# コンパイラでは、派生クラスから基底クラスへの暗黙的なキャストのみが許可され、その逆は許可されません。あなたの場合、オブジェクトから派生クラスである Myclass に明示的にキャストする必要があります

于 2012-06-13T04:55:40.667 に答える
3

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ます。正しい型でない場合にランタイムが例外をスローするように、キャストする必要があります。

于 2012-06-13T05:05:43.733 に答える
1

C# は静的に型付けされた言語です。あなたはそれobjがタイプであることを示しましたobject。言語は静的に型付けされているため、指定した明示的な型をコンパイラが尊重し、 を であるかのようobjに処理しようとしているという事実について不平を言うことしか期待できません。objectMyClass

于 2012-06-13T05:06:21.410 に答える
1
MyClass myClass1 = new MyClass();
MyClass myClass2 = myClass1 ;

タイプ A のクラスを同じタイプの別のクラスに直接割り当てることはできますが、コンパイラはそのオブジェクトがどのタイプであるかを知らないため、タイプのないオブジェクトには割り当てることができません。その場合はキャストが必要です

MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = (MyClass)obj;

(MyClass)obj;obj が MyClass 型であることをコンパイラに伝えているため、これは機能します

于 2012-06-13T05:11:42.810 に答える