2010-03-21 7 views
1

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

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

Этот пример кода будет более читаемым, если вы заменили 'var' ключевое слово с фактическими предполагаемыми типов. –

+0

Проголосовало за закрытие, так как это вторая попытка спросить: http://stackoverflow.com/questions/2486791/how-do-cast-an-object-to-a-string-when-object-is- not-a-string/2486815 # 2486815, за исключением того, что существует еще меньше контекстуальной информации. –

+0

@ Daniel Earwicker: Я чувствую, что часть строки смущает людей, и то, что я делаю выше, - это то, что я делаю в коде. – 2010-03-21 11:39:36

ответ

4

Вы пробовали сделать следующее?

[...] 
var ee = (A)(B)o; 

Причина этого будет работать, и ваш код не является то, что такие явные слепки статически скомпилирован. Другими словами, когда вы говорите (A)o, компилятор ищет явное выражение от объекта до A и не находит его. Тем не менее, он определяет, что A является подклассом объекта, поэтому приведение в действие может быть жизнеспособным во время выполнения - и оно вставляет попытку выполнить run-down экземпляр в поле типа A. Такие приведения во время выполнения не имеют ничего общего с явными и/или неявными преобразованиями; они просто следуют правилам иерархии встроенного типа.

Другой пример:

object o = 1.0; 
int i = (int)o; //throws InvalidCastException - even though (int)1.0 is OK. 
+0

, чтобы сделать это более понятным. – 2010-03-21 11:29:56

+0

+1 для объяснения причин, почему перегрузка операторов не работает. Я, скорее всего, соглашусь с этим. – 2010-03-21 11:54:38

+0

Справа. Это точно так же, как и разрешение перегрузки. Если вы скажете «ob = giraffe», и у вас есть перегруженные методы M (объект) и M (Animal), тогда M (ob) выбирает перегрузку объекта во время компиляции независимо от того, что ob находится во время выполнения. Компилятор выбирает оператор преобразования «объект в А» над оператором преобразования «В-А», потому что это то, что известно во время компиляции. Это то, что вы получаете за статически типизированный язык; если вы хотите, чтобы он был динамически типизирован, тогда (1) используйте динамически типизированный язык или (2) используйте динамическое ключевое слово в C# 4. –