abatido e upcast

Eu sou novo emC # (eOOP). Quando eu tenho algum código como o seguinte:

class Employee
{
    // some code
}


class Manager : Employee
{
    //some code
}

Questão 1: Se eu tenho outro código que faz isso:

   Manager mgr = new Manager();
   Employee emp = (Employee)mgr;

AquiEmployee é umManager, mas quando eu lanço assim para umEmployee isso significa que eu estou upcasting isso?

Questão 2:

Quando eu tenho váriosEmployee objetos de classe e alguns, mas nem todos eles sãoManagerComo posso abatê-los quando possível?

questionAnswers(5)

yourAnswerToTheQuestion