Это суть наследования и полиморфизма.
Если вы можете определить, что экземпляр Animal на самом деле является экземпляром Tiger, вы можете разыграть его:
((Tiger)zoo.Animal).NoStripes = 1;
Однако, если вы попытаетесь сделать это на экземпляре Animal, который не является Tiger, вы получите исключение времени выполнения.
, например:
Zoo zoo = new Zoo();
zoo.animal = new Tiger();
((Tiger)zoo.Animal).NoStripes = 1; //Works Fine
((Lion)zoo.Animal).NoStripes = 1; //!Boom - The compiler allows this, but at runtime it will fail.
Существуетальтернативный синтаксис приведения, использующий ключевое слово «as», которое возвращает ноль, а не исключение в случае сбоя приведения.Это звучит замечательно, но на практике вы, скорее всего, получите незначительные ошибки позже, когда будет уничтожен нулевой объект.
Tiger temp = zoo.Animal as Tiger; //This will not throw an exception
temp.NoStripes = 1; //This however, could throw a null reference exception - harder to debug
zoo.Animal = temp;
Чтобы избежать исключения нулевой ссылки, вы можете проверить нуль, конечно
Tiger temp = zoo.Animal as Tiger; //This will not throw an exception
if (temp != null)
{
temp.NoStripes = 1; //This however, could throw a null reference exception - harder to debug
zoo.Animal = temp;
}