A GlowStruct
- это Colour
, но это не значит, что Colour
- это GlowStruct
.
Если Blue
имеет тип Colour
, чем вы можетене приводите его к GlowStruct
напрямую, потому что GlowStruct
требует дополнительной информации, которой у класса Colour
просто нет - вот почему оператор is
существует в первую очередь - чтобы вы могли определить типэкземпляр, когда у вас есть только ссылка на некоторый базовый класс или тип интерфейса.
В более общих чертах, производный класс - это особый тип своего базового класса, но класс не является типом любого изклассы, которые могут быть производными от него - если бы это было так, вся система типов стала бы избыточной, поскольку любой тип в конечном счете был бы производным от object
, и поэтому все можно было привести к чему-либо еще.
И в качестве другого примера- тигр - это разновидность кошачьих (в основном кошек), и все кошки - млекопитающие, а все млекопитающие - животные, но это не значит, что любое животное является тигром, кошкой или даже млекопитающим.
Transс учетом #:
class Animal {}
class Mammal : Animal {}
class Felidae : Mammal {}
class Tiger : Felidae {}
вы можете сделать что-то вроде этого:
Animal myTiger = new Tiger();
var mammal = myTiger as Mammal;
var felidae = myTiger as Felidae;
var tiger = myTiger as Tiger;
но вы, если вы попытаетесь сделать что-то вроде этого -
Animal myTiger = new Animal();
var mammal = myTiger as Mammal;
var felidae = myTiger as Felidae;
var tiger = myTiger as Tiger;
тогдаmammal
, felidae
и tiger
будут равны null
, поскольку животное может быть гадюкой, а не млекопитающим, не кошкой и демонстративно не тигром.