Как я могу привести A к объекту к классу A, когда B может печатать на A? - PullRequest
1 голос
/ 21 марта 2010

В основном я хочу сделать это. aa вызывает исключение неправильного приведения.
ПРИМЕЧАНИЕ: о может быть НИЧЕГО. Это может быть не B, это может быть C, D, E, F и т. Д. Но это должно работать, пока o является классом, который может типизировать в A (B такой класс. Он использует неявную перегрузку оператора)

        var b = (B)"sz";
        var a = (A)b;
        object o = b;
        var aa = (A)o;

1 Ответ

4 голосов
/ 21 марта 2010

Вы пытались сделать следующее?

[...]
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.
...