Вы путаете тип переменной и тип объекта времени выполнения, на который она будет указывать (учитывая тип ссылки, с типами значений, такого различия нет).
Когда вы объявляете переменная, вы определяете тип переменной :
Foo a = ... //a is of type Foo at compile time.
То, что вы присваиваете этой переменной, не имеет значения вообще (если вы не используете переменные с неявным типом с var
)
Но, учитывая следующий код:
object o = new Foo();
Теперь вы можете увидеть разницу; переменная o
имеет тип object
, но объект времени выполнения, на который она будет указывать, имеет тип string
.
В своем вопросе вы спрашиваете, почему вы не можете сделать следующее:
var stringLength = o.Length; //o is a string isn't it?
Почему? Разве o
не действительно string
. Да, но эта информация доступна только во время выполнения , компилятор ничего не знает о том, что произойдет во время выполнения, он знает только, что o
имеет тип object
, а object
не имеет Length
имущество. Единственное, в чем убедится компилятор, это то, что типы совместимы; это позволит вам присвоить Giraffe
типизированной переменной Animal
, но не позволит вам присвоить Car
.
Если у вас все ясно, то вы поймете, почему это не имеет смысла:
Но я явно возвращал B внутри метода getType (), почему у него нет доступа к Foo ()?
Поскольку метод getType
тип возврата A
не B
, не C
и не D
.