Что происходит внутри, что производный класс может быть назначен базе, но требуется обратное явное преобразование? Обнаружен один и тот же результат, даже если базовый и производный класс содержат один и тот же член.
Почти ничего внутри не происходит, в любом случае. Объект не изменяется или не копируется; скорее просто ссылка на него сохраняется в новой переменной другого типа.
Неявное преобразование из dog
в animal
разрешено, потому что если переменная dog
может содержать ссылку на объект, тогда объект должен быть dog
или poodle
или еще чем-то, поэтому Переменная animal
также может содержать ссылку на нее.
В отличие от этого, требуется явное преобразование из animal
в dog
, поскольку объект animal
в действительности не может быть dog
, и в этом случае система времени выполнения вызовет исключение. (Помните, когда я сказал, что «почти ничего не происходит внутри»? Это « почти ничего», потому что система времени выполнения должна будет проверить, чтобы убедиться, что объект является dog
, и поднять исключение в противном случае.)
Это решение по разработке языка & mdash; мы определенно могли бы создать язык, точно такой же, как C #, за исключением того, что dog d = a;
эквивалентен dog d = (dog) a;
, но разработчики C # (и многих похожих языков) чувствовали, что для dog d = a;
было бы непонятно повышать время выполнения исключение иногда. Явное приведение проясняет, что исключение возможно, если a
не ссылается на dog
.