Думайте об этом так, вы можете привести Программу к Тесту, потому что Программа - Тест.
Вы не можете привести Тест к Программе, потому что Тест - это не Программа.
Это ВСЕГДА безопасно снижать, только безопасно, если вы уверены, что объект этого типа.
Необходимость перехода в исходное состояние часто является запахом кода, если вы обнаружите, что вам часто требуется преобразовать ваши объекты в объект, возможно, что-то не так с вашим дизайном.
Надеюсь, это поможет,
РЕДАКТИРОВАТЬ: Всегда ли безопасно снижать?
Акт понижения происходит по определению - по моему мнению, - когда вы знаете тип объекта, и вы понижаете его вниз по дереву наследования. например
Кошка и собака оба наследуют от животных, дуб и береза оба наследуют от дерева.
ВСЕГДА безопасно делать это
public void DoThingWithCat(Cat snuggles)
{
snuggles.Meow();
DoThingWithAnimal(snuggles); // this is always OK, because we know
// the type of snuggles, and we know
// snuggles is an animal
}
Это UpCast. Это небезопасно, также этот код является запахом кода, возможно, что-то не так с вашей иерархией объектов, если вам нужно это сделать.
public void DoSomethingElse(Animal anAnimal)
{
DoThingWithCat(anAnimal); // this is NOT always OK, because we
// DO NOT know the type of anAnimal,
// and it may not be a Cat
}
Это также небезопасно, потому что это прямое литье, не обязательно литье вверх или вниз
public void DoSomethingDifferent(object anObject)
{
DoThingWithAnimal(anObject); // this may or may not work,
// depending on the type passed in,
// this is a recipe for disaster,
// because may not be an Animal,
// it could be a Tree.
}