Не совсем уверен, что вы имеете в виду? Оба написанных вами утверждения компилируются и работают нормально.
Вы хотели написать это как вопрос ...?
Dog foo = new Mammal(); // Invalid, wants an explicit cast
Dog bar = (Dog)new Mammal(); // This one works
Если это было то, что вы имели в виду (что соответствовало бы комментариям), то первый не скомпилируется, потому что Mammal
не является Dog
и компилятор знает это, поэтому он не позволит вам назначить его ( Dog
- это Mammal
, потому что оно получено из него, но обратное утверждение не выполняется). Во втором случае вы переопределяете правильное суждение компилятора и говорите, что лучше знаете, что Mammal
действительно является Dog
, но, как это не так, это утверждение не выполнится во время выполнения с InvalidCastException
.