The explicit reference conversions are: From object to any reference-type. From any class-type S to any class-type T, provided S is a base class of T. From any class-type S to any interface-type T, provided S is not sealed and provided S does not implement T. From any interface-type S to any class-type T, provided T is not sealed or provided T implements S. From any interface-type S to any interface-type T, provided S is not derived from T. From an array-type S with an element type SE to an array-type T with an element type TE, provided all of the following are true: S and T differ only in element type. (In other words, S and T have the same number of dimensions.) Both SE and TE are reference-types. An explicit reference conversion exists from SE to TE.
From System.Array and the interfaces it implements, to any array-type. From System.Delegate and the interfaces it implements, to any delegate-type.
The explicit reference conversions are those conversions between reference-types that require run-time checks to ensure they are correct.
For an explicit reference conversion to succeed at run-time, the value of the source operand must be null, or the actual type of the object referenced by the source operand must be a type that can be converted to the destination type by an implicit reference conversion (13.1.4). If an explicit reference conversion fails, a System.InvalidCastException is thrown.
Reference conversions, implicit or explicit, never change the referential identity of the object being converted. [Note: In other words, while a reference conversion may change the type of the reference, it never changes the type or value of the object being referred to. end note]