In your case
Employee emp = (Employee)mgr; //mgr is Manager
you are doing an upcasting.
An upcast always succeeds unlike a downcast that requires an explicit cast because it can potentially fail at runtime.(InvalidCastException).
C# offers two operators to avoid this exception to be thrown:
Starting from:
Employee e = new Employee();
First:
Manager m = e as Manager; // if downcast fails m is null; no exception thrown
Second:
if (e is Manager){...} // the predicate is false if the downcast is not possible
Warning: When you do an upcast you can only access to the superclass' methods, properties etc...