Q:

Why can't I implicitly cast this object to a class reference

Can someone please explain why this doesn't work?  
MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = obj; <-- error

If obj "points" to the same block of memory of type MyClass, then why can I not "point" myClass2 to the same block of memory on the last line? 
Thanks for any help.

A:

The type of myClass2 is "MyClass".  You can assign to it any value that is of a type that is, or derives from, MyClass.  object is not and does not derive from MyClass, so you need a cast.  
If it were able to do this implicitly, what would happen if you did it with an object that is not really a MyClass?

A:

c# compiler only allows you to implicitly cast from derived class to base class, not the other way around. In your case, you need to explicitly cast from object to Myclass which is the derived class

A:

Because object is a base class here.
If I have this:
class Square : Shape
{
}

class Circle : Shape
{
}

I can do 
Shape c = new Circle();

Think about this semantically, a circle is a shape. I can store a circle as a shape.
But I can't do:
Circle c = new Shape();

Because a shape is NOT a circle, it could be a Square. Consider: 
Shape sq = new Square();
Shape cr = new Circle();

According to how you see it, this should then work:
Circle x = cr;

But without a cast even this should work:
Circle x = sq;//this will blow up, sq is a square.

Therefore you need a cast. Similarly an object could be anything a Form, a Button or a MyClass. You need to cast it so the runtime will throw an exception if it isn't the correct type.

