Any cast - implicit or explicit - changes the type of an object: but it doesn't actually change the object at all, it just checks that the object is of a type suitable to cast, and that such a cast operation exists.
For example, explicit cast operators exist for int to decimal, double to float, float to byte, byte to integer, and so on. It is also possible to cast up or down the inheritance tree:
class A {}
class B : A {}
class C : B {}
class D : A {}
All these will work:
A a = new C();
B b = (C) a;
C c = (C) a;
This will compile, but will fail at run time:
D d = (D) a;
because although D is derived from A and so is C, you can't cast an instance of C to a class D because there is no direct derivation, and no explicit cast operator.
It compiles because D is derived from A, so an A variable might be holding an instance of D, but will fail at run time if it isn't.
So yes, the cast is performed at runtime, but nothing gets actually changed - the system just checks that it's a legal cast which it can;t do at compile time.