I know there are several posts already concerning the difference between casts and the as operator. They all mostly restate the same facts:
as
It is a matter of type safety. Any T cannot by convert to a Bar, but any Tcan be "seen" as a Bar since the behavior is well defined even if there is no conversion from T to Bar.
T
Bar