Причины литого либо допускаются или не допускаются аза за наследованием.
Детский класс (или производный класс) всегда является базовым классом, но противоположное не соответствует действительности.
Для объяснения, давайте использовать некоторые более реальные имена мира для примера классов:
class Animal
{
}
class Dog : Animal
{
}
class Cat : Animal
{
}
Таким образом, для вашего примера (1):
Animal b = new Dog();
Dog c = (Dog)b
Это верно, потому что все собаки являются животные и ваше животное b на самом деле является собакой, поэтому актерский состав успешно завершен.
Для примера (2):
Dog c = (Dog)new Animal();
Animal b = (Animal)c;
Это невозможно, потому что вы назначаете объект животного к собачке, но вы знаете, что не все животные Собака, некоторые животные являются кошки.
А для примеров (3) & (4):
Dog c = new Dog();
Animal b = (Animal)c;
Это то же самое, как ваш пример 1 выше. Все собаки - животные, поэтому любая собака может быть классифицирована как животное и брошена (на самом деле вам не нужна броска, будет неявный бросок, и вы можете записать ее как Animal b = c;
Обратите внимание, что (2) * * разрешено компилятором, но вы получите 'InvalidCastException' во время выполнения. –