Вы пытались сделать следующее?
[...]
var ee = (A)(B)o;
Причина, по которой это будет работать, а ваш код - нет, заключается в том, что такие явные приведения статически компилируются. Другими словами, когда вы говорите (A)o
, компилятор ищет явное приведение от объекта к A
и не находит его. Однако он определяет, что A
является подклассом объекта, поэтому приведение может быть жизнеспособным во время выполнения - и оно вставляет попытку понижающего приведения экземпляра во время выполнения в поле типа A
. Такое приведение во время выполнения не имеет ничего общего с явными и / или неявными преобразованиями; они просто следуют встроенным правилам иерархии типов.
Другой пример:
object o = 1.0;
int i = (int)o; //throws InvalidCastException - even though (int)1.0 is OK.